返回关系设置存在一个关系?

时间:2013-08-24 19:20:30

标签: mysql

Here's the relevant part of my database on SQLFiddle.

鉴于设置,我想编写一个查询“选择所有标签所有标签所包含的所有标签的列表和所有标签的列表”。

我的预期结果集是:

thing1 | tag1,tag2
thing2 | tag2,tag3

我尝试了各种连接和分组方法以及GROUP_CONCAT(),但我似乎无法使用任何东西。

如何通过1个查询从数据库中提取所需的结果集?

3 个答案:

答案 0 :(得分:1)

有点hacky,因为它使用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

答案 1 :(得分: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

答案 2 :(得分:0)

不使用FIND_IN_SET,正如Waleed Khan建议的那样,我已经准备了一个使用WHERE - 子句的查询。这不会在带逗号的标签上中断,通常是......

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-Fiddle