1

AND 方式でタグを一致させることにより、記事のフィルタリングを正常に取得できました。

これは私の現在のコードです:

SELECT *
FROM articles a
JOIN article_tags a_t ON a_t.article_id = a.id
LEFT JOIN tags t ON t.id = a_t.tag_id
WHERE t.caption IN ('fire', 'water', 'earth')
HAVING COUNT(DISTINCT t.caption) = 3

どこ:

  • articleは、取得したい記事で、ID、タイトルなどがあります…</li >
  • tagsは、id とキャプションを含むタグのリストです。
  • article_tags article_id と tag_id を持つ関係テーブル

問題は、マッチング後、各記事にあるすべてのタグを取得したいということです。3つの異なるタグが一致していても、1つは5つのタグ、他の4つのタグは、各行に含めたい. 「タグ、タグ、タグ」のようなもの、または「タグ」列に解析できるものは何でも。

何か案は?私はそれを回避する方法を見つけることができません...

4

1 に答える 1

3

クエリをサブクエリとして結合し、すべてのタグを返し、それらをGROUP_CONCAT().

select a.*, GROUP_CONCAT(DISTINCT t.caption) tags
from (select distinct a.*
      from articles a
      JOIN article_tags a_t on a_t.article_id = a.id
      JOIN tags t on t.id = a_t.tag_id
      WHERE t.caption IN ('fire', 'water', 'earth')
      GROUP BY a.id
      HAVING COUNT(DISTINCT t.caption) = 3) a
JOIN article_tags a_t on a_t.article_id = a.id
JOIN tags t on t.id = a_t.tag_id
GROUP BY a.id

ところで、LEFT JOINクエリで使用する理由はありません。一致する行のみを気にするからですtags

の必要性についても疑問にDISTINCT思いCOUNT()ます -- 同じキャプションを持つ複数のタグ ID を本当に許可しますか?

于 2013-09-14T22:11:57.330 に答える