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

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

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

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

WordPress

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

Q&A

1回答

2921閲覧

MySQLで一部重複するレコードを一つにまとめたい

kenny_sayama

総合スコア1036

MySQL

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

WordPress

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

0グッド

0クリップ

投稿2016/10/06 05:53

編集2016/10/06 06:53

###前提・実現したいこと

Wordpressから直接外部へレコードを引っ張ってこようとして、困っているのでお力をお借りしたいです。

やりたいこととしまして、Wordpressのカテゴリーやタグなどを引っ張ってきたのですが、カテゴリーやタグが複数あると、配列が複数に分かれて出力されてしまいます。
例えば、最新のpost(id=1)にカテゴリーがhogehoge2のようにあると、ループした時に、post(id=1)が二回ループされ、最初にhogeその次の配列にhoge2が入ってきてしまような状態です。

これをpost(id=1)内に納めたいです。

また下記のSQLもっといい書き方ありましたら指南いただきたいです。

###該当のソースコード

SQL

1$sql = "SELECT * FROM $wpdb->posts AS P JOIN $wpdb->term_relationships AS TR ON P.id = TR.object_id JOIN $wpdb->term_taxonomy AS TT ON TR.term_taxonomy_id = TT.term_taxonomy_id JOIN $wpdb->terms AS T ON TR.term_taxonomy_id = T.term_id WHERE post_status = 'publish' ORDER BY post_date DESC LIMIT 30";

###データサンプル

該当するテーブル

  • wp_posts
  • wp_terms
  • wp_term_relationships
  • wp_term_taxonomy

######関係のありそうな部分のカラムだけ載せておきます。
wp_postsの構造(記事情報が格納されている)

  • id
  • title

wp_termの構造(カテゴリとタグが格納されている)

  • term_id
  • name (カテゴリ or タグの名前)
  • slug (カテゴリ or タグのスラッグ名)

wp_term_relationshipsの構造()

  • object_id
  • term_taxonomy_id

wp_term_taxonomy

  • term_taxonomy_id
  • term_id
  • taxonomy (category or post_tagが格納されこちらでタグかカテゴリの判別がされている)

例:
以下のような1記事のレコードがあったとします。

// wp_posts(記事データ) * id = 1 * title = hoge // wp_term_relationship(記事に関連付けを行う) * object_id = 1(postの記事に紐づいてる) * term_taxonomy_id = 1 * object_id = 1 * term_taxonomy_id = 2 // wp_terms(カテゴリーとタグが格納されている) * term_id = 1 * name = 旅行 * slug = trip * term_id = 2 * name = フード * slug = food // wp_term_taxonomy(カテゴリーかタグか判断させるテーブル) * term_taxonomy_id = 1 * term_id = 1 * taxonomy = post_tag * term_taxonomy_id = 2 * term_id = 2 * taxonomy = post_tag

以上のレコードを取得してダンプしますと、
postsが1であるのに、カテゴリーが2つ存在するため、配列が2つに分かれてしまいます。

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

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

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

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

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

yambejp

2016/10/06 06:08

mysql側のテーブルとデータサンプルを書いて、SQL文を例示ください
kenny_sayama

2016/10/06 06:50

サンプルデータを追加いたしましたm(_ _)m
guest

回答1

0

term_relationships
テーブルのプライマリキーは、(object_id, term_taxonomy_id) となっていて、postsテーブルとプライマリーキーでつながっていませんから、term_relationships (object_id=1) で登録されているカテゴリー数の分出力されることになります。
(object_id=1)の登録カテゴリーが1つなら1行、(object_id=1)の登録カテゴリーが3つなら3行出力されることになります。

post(id=1)内に納めたい

2行目以降のカテゴリーをどこに、どのようにまとめたいのでしょう?
SQLの結果セットはマトリックス(Excelイメージ)になりますから、Excelで結果のイメージが書けないのならSQLにはなりません。

まずは、あなたが欲しい結果のマトリックス(Excelイメージ)を書いてみてください。

投稿2016/10/06 06:55

kantomi

総合スコア295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問