現在、最新の投稿と関連する投稿 (各投稿の x 番号) を取得しようとしています。私は手に次のクエリを持っています:
SELECT id, title, content
(SELECT GROUP_CONCAT(title) FROM posts -- Select title of related posts
WHERE id <> p.id AND id IN (
SELECT p_id FROM tagsmap -- Select reletad post ids from tagsmap
WHERE t_id IN (
SELECT t_id FROM tagsmap -- Select the tags of the current post
WHERE p_id = p.id)
) ORDER BY id DESC LIMIT 0, 3) as related
FROM posts as p ORDER BY id DESC LIMIT 5
私のデータベース構造は単純です: posts テーブルです。タグ テーブル。そして、投稿をタグに関連付ける tagsmap テーブル。
このクエリは正常に動作します (ただし、テーブルに多くの行がないため、そのパフォーマンスはわかりません。説明が役立つかもしれませんが、現在はそうではありません)。
本当に必要なのは、関連する投稿の ID とそのタイトルを取得することです。
だから私はやりたいのですがSELECT GROUP_CONCAT(title), GROUP_CONCAT(id)
、それはエラーになることを知っています。この場合、ID とタイトルを取得する最良の方法は何ですか? ID を取得するためだけにサブクエリ全体を書き直したくありません。別の方法があるはずです。
編集
SELECT p1.id, p1.title, p1.content,
group_concat(DISTINCT p2.id) as 'P IDs',
group_concat(DISTINCT p2.title) as 'P titles'
FROM posts as p1
LEFT JOIN tagsmap as tm1 on tm1.p_id = p1.id
LEFT JOIN tagsmap as tm2 on tm2.t_id = tm1.t_id and tm1.p_id <> tm2.p_id
LEFT JOIN posts as p2 on p2.id = tm2.p_id
GROUP BY p1.id
ORDER BY p1.id desc limit 5;
最後に、これは私が使用したクエリです。Where 句を削除したのは、不要であり、タグのない投稿を無視するためではLEFT JOIN
なく使用されているためです。JOIN
最後DISTINCT
に group_concat に追加されたのは、重複した行を連結していたためです (たとえば、投稿に関連する投稿と共通のタグが複数ある場合、重複した連結が発生します)。
上記のクエリは完全に機能します。全てに感謝。