1

次のクエリで:

SELECT p.*,  i.*, GROUP_CONCAT(DISTINCT(pc.category_id)) AS post_categories, GROUP_CONCAT(DISTINCT(pt.tag_id)) AS post_tags 
FROM posts AS p 
LEFT JOIN images AS i ON p.post_image = i.image_id 
LEFT JOIN post_categories AS pc ON p.post_id = pc.post_id 
LEFT JOIN post_tags AS pt ON p.post_id = pt.post_id 
WHERE p.post_url="'.$id.'"

ブログ投稿のリストを返し、以下を取得します。

  1. 投稿テーブルのすべての列
  2. 画像テーブルのすべての列(投稿画像用)
  3. すべての連結category_id(投稿用)
  4. すべての連結tag_id(投稿用)

これが私に残しているのは、実際には役に立たない2つのフィールドです。

  • 連結されたcategory_id文字列(つまり「1,3」)
  • および連結されたtag_id文字列(つまり、「2,5,8」)

両方の中でサブクエリを実行したいLEFT JOINSので、代わりに次のリストを返すことができます。

  • category_nameの(すなわち「瞑想、スポーツ」)
  • tag_nameの(つまり、「iOS、PHP、MySQL」)

投稿ごとに。

私は現在、両方のカテゴリとタグのサブクエリで立ち往生しています。

テーブル構造:


投稿

post_id、post_titleなど。


カテゴリ

category_id、category_name


タグ

tag_id、tag_name


post_categories

post_id、category_id


post_tags

post_id、tag_id


質問:そのようなことを効果的に行うことは可能ですか?もしそうなら、どのように?

そうでない場合は、配列に格納SELECT * FROM categoriesしてから、配列内のそれぞれを、毎回配列内の各投稿の展開された文字列$categoriesと比較する必要がありますか?category_id$categoriescategory_id$posts

4

2 に答える 2

1

タグカテゴリのテーブルに参加して、連結を名前フィールドに置き換えることができるはずです。(また、重複したメイン行を返さないように、selectにDistinctを追加する必要があります。)

SELECT DISTINCT p.*,  i.*, 
    GROUP_CONCAT(DISTINCT(c.category_name)) AS post_categories,
    GROUP_CONCAT(DISTINCT(t.tag_name)) AS post_tags 
FROM posts AS p 
    LEFT JOIN images AS i ON p.post_image = i.image_id 
    LEFT JOIN post_categories AS pc ON p.post_id = pc.post_id 
    LEFT JOIN post_tags AS pt ON p.post_id = pt.post_id 
    LEFT JOIN categories AS c ON pc.category_id = c.category_id
    LEFT JOIN tags AS t ON pt.tag_id = t.tag_id
WHERE p.post_url="'.$_GET['id'].'"
于 2012-04-24T22:46:41.570 に答える
1

次に、GROUP_CONCATでIDの代わりに、それぞれのカテゴリ名とタグの説明を取得してみませんか。

于 2012-04-24T22:46:59.933 に答える