1

現在、最新の投稿と関連する投稿 (各投稿の 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 に追加されたのは、重複した行を連結していたためです (たとえば、投稿に関連する投稿と共通のタグが複数ある場合、重複した連結が発生します)。

上記のクエリは完全に機能します。全てに感謝。

4

2 に答える 2

2

このような?

SELECT id, title, content
       (SELECT GROUP_CONCAT(concat(cast(id as varchar(10)), ':', 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 post_id = p.id) 
           ) ORDER BY id DESC LIMIT 0, 3) as related 
FROM posts as p ORDER BY id DESC LIMIT 5
于 2013-03-22T21:08:58.550 に答える