次のクエリで:
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.'"
ブログ投稿のリストを返し、以下を取得します。
- 投稿テーブルのすべての列
- 画像テーブルのすべての列(投稿画像用)
- すべての連結
category_id
(投稿用) - すべての連結
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
$categories
category_id
$posts