1

これは、SQLFiddle に関する私のデータベースの関連部分です。

その設定を考慮して、「th.thing と、すべてのタグのリストに tag2 が含まれるすべてのタグのリストを選択する」というクエリを書きたいと思います。

私の予想される結果セットは次のようになります。

もの1 | タグ1、
タグ2 タグ2、タグ3

と一緒にさまざまな結合とグループ化方法を試しましたがGROUP_CONCAT()、何も機能しないようです。

1 つのクエリでデータベースから目的の結果セットを取得するにはどうすればよいですか?

4

3 に答える 3

1

を使用しているため、少しハックですFIND_IN_SETが、動作するようです ( sqlfiddle )。

タグのいずれかにコンマが含まれている場合、GROUP_CONCATそのコンマをエスケープするために特別なことは何もしていないように見えるので、FIND_IN_SETそれがデリミタと見なされるため、機能するとは考えていません。

SELECT
  things.thing,
  GROUP_CONCAT(tags.tag) AS tags
FROM things
JOIN relationships
  ON things.id = relationships.thing_id
JOIN tags
  ON relationships.tag_id = tags.id
GROUP BY things.id
HAVING FIND_IN_SET('tag2', GROUP_CONCAT(tags.tag));

収量:

THING   TAGS
thing1  tag2,tag1
thing2  tag2,tag3
于 2013-08-24T19:36:08.367 に答える
1

半結合も FIND_IND_SET も使用せず、
単純結合のみの別のバージョン

SELECT th.thing, GROUP_CONCAT(ta.tag) as tags
FROM things th
JOIN relationships r
ON   th.id = r.thing_id
JOIN tags ta
ON   ta.id = r.tag_id
JOIN things th2
ON th.id = th2.id
JOIN relationships r2
ON th2.id = r2.thing_id
JOIN tags ta2
ON ta2.id = r2.tag_id
WHERE ta2.tag = 'tag2'
GROUP BY th.id;

デモ: --> http://sqlfiddle.com/#!2/03faf/21

于 2013-08-24T19:50:44.903 に答える
0

を使用せずに、FIND_IN_SETWaleed Khan が提案したように、WHERE-clause を使用するクエリを用意しました。これは、通常、コンマを含むタグで壊れません...

SELECT th.thing, GROUP_CONCAT(ta.tag) as tags
FROM relationships r
INNER JOIN things th ON th.id = r.thing_id
INNER JOIN tags ta ON ta.id = r.tag_id
WHERE th.id IN (SELECT r2.thing_id
                FROM relationships r2
                INNER JOIN tags ta2 ON ta2.id = r2.tag_id
                WHERE ta2.tag = "tag2")
GROUP BY th.id

SQLフィドル

于 2013-08-24T19:42:01.757 に答える