Here's the relevant part of my database on SQLFiddle.
鉴于设置,我想编写一个查询“选择所有标签所有标签所包含的所有标签的列表和所有标签的列表”。
我的预期结果集是:
thing1 | tag1,tag2
thing2 | tag2,tag3
我尝试了各种连接和分组方法以及GROUP_CONCAT()
,但我似乎无法使用任何东西。
如何通过1个查询从数据库中提取所需的结果集?
答案 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