質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

1回答

1012閲覧

WordPressのDBのSQL操作で投稿に対応したカスタムフィールドの抽出方法がわからない。

tomato01

総合スコア82

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2021/05/13 04:43

編集2021/05/13 08:00

WordPressのDBに関して、SQL操作で投稿に対応したカスタムフィールドの抽出方法がわかりません。

下記のようなテーブルがあった際に、IDの549に対応するカスタムフィールドを
1件のデータとして抽出するにはどうしたらいいでしょうか。

尚、その際にmeta_keyにアンダーバー(_)が先頭についているレコードは除外をしたいです。

wp_postsテーブル

ID | post_content | post_type 549 | aaaaaaaaa | post 555 | bbbbbbbbb | acf-field

wp_postmetaテーブル

meta_id | post_id | meta_key | meta_value 2281 | 549 | lat | 34.7355884 2282 | 549 | _lat | field_5ebcb731afa8e 2283 | 549 | lng | 135.282661 2284 | 549 | _lng | field_5ebcb761afa8f

抽出したいテーブルのイメージ
→IDの549に対応するカスタムフィールドを1件のデータとして抽出したい

ID | post_content | post_type | lat | lng

549 | aaaaaaaaa | post | 34.7355884 | 135.282661

下記のSQLで抽出をした場合ですと、テーブルの結合はできるのですが、そこからさらに
レコードをまとめることができません。

SELECT * FROM wp_posts JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id WHERE wp_posts.post_type="post" AND wp_posts.id="549" AND wp_postmeta.meta_key NOT LIKE '\_%';

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/05/13 05:22 編集

Worppress → WordPress >タイトル並びに本文
tomato01

2021/05/13 06:08

ご指摘ありがとうございます。修正いたしました。
guest

回答1

0

ベストアンサー

meta_keyがlatやlngになっている値を横持ちしたいということであれば、以下のようなクエリで実現できるかと思います。

SQL

1SELECT ID, 2 post_content, 3 post_type, 4 MAX(CASE WHEN meta_key = 'lat' THEN meta_value END) AS lat, 5 MAX(CASE WHEN meta_key = 'lng' THEN meta_value END) AS lng 6 FROM wp_posts 7 JOIN wp_postmeta 8 ON wp_posts.id = wp_postmeta.post_id 9 WHERE wp_posts.id = '549' 10 GROUP BY ID;

2021/05/13 22:15追記

尚、こういったケースでは、オブジェクトみたいな感じにするのではと少し考えてたのですが、そういったこともできそうでしょうか。

MySQL8.0であればJSON_OBJECTAGGを使ってJSON型にまとめてしまうのも一つの手かもしれません。

sql

1SELECT ID, 2 post_content, 3 post_type, 4 JSON_OBJECTAGG(meta_key, meta_value) 5 FROM wp_posts 6 JOIN wp_postmeta 7 ON wp_posts.id = wp_postmeta.post_id 8 WHERE wp_posts.id = '549' 9 AND meta_key NOT LIKE '\_%' 10 GROUP BY ID;

投稿2021/05/13 09:16

編集2021/05/13 13:17
neko_the_shadow

総合スコア2349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomato01

2021/05/13 11:13

ご回答を頂き誠にありがとうございます。 思った通りの感じになりました! 尚、こういったケースでは、オブジェクトみたいな感じにするのではと少し考えてたのですが、そういったこともできそうでしょうか。 例 meta_key{ lat:34.7355884, lng: 135.282661}
tomato01

2021/05/13 14:00

ご回答頂き誠にありがとうございます!JSON_OBJECTAGGというのがあるのですね!とても勉強になりました。どうもありがとうございました!
tomato01

2021/05/14 07:54

neko_the_shadowさん 申し訳ございません、もし可能でしたらもう一点おしえてほしいのですが、Whereでlatやlngの値で絞り込みたいのですが、エラーになってしまいます。 SELECT ID, post_content, post_type, MAX(CASE WHEN meta_key = 'lat' THEN meta_value END) AS lat, MAX(CASE WHEN meta_key = 'lng' THEN meta_value END) AS lng FROM wp_posts JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id WHERE wp_posts.id = '549' AND wp_postmeta.lat ='34.7355884' GROUP BY ID; wp_postmetaのレコードの値で絞り込みたい場合はどのように記載をすればいいでしょうか。
neko_the_shadow

2021/05/14 14:38 編集

WHEREではなくHAVINGを使えばよいかと思います。 SELECT ID, post_content, post_type, MAX(CASE WHEN meta_key = 'lat' THEN meta_value END) AS lat, MAX(CASE WHEN meta_key = 'lng' THEN meta_value END) AS lng FROM wp_posts JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id WHERE wp_posts.id = '549' GROUP BY ID HAVING lat ='34.735588'
tomato01

2021/05/15 11:34

お忙しい中ご回答を頂きありがとうございます!havingというのもはじめて聞きました。自分でも勉強してみます。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問