我有三张桌子

objects     id, field1, field2, ...
groups      id, title, color
group_ref   oid, gid


因此,每个对象都可以分为n组。

我想显示一个对象列表,该列表的一个字段是对象所在的组。所以这是我想出的:

SELECT o.id,
CONCAT_WS("||", GROUP_CONCAT(gx.gid separator "|"), GROUP_CONCAT(gr.title, "#", gr.color separator "|")) AS groups
FROM objects AS o
LEFT JOIN group_ref AS gx ON o.id = gx.oid
LEFT JOIN groups AS gr ON gx.gid = gr.id
WHERE 1
GROUP BY o.id


实际可行,我可以在(连接的)组字段中创建所需的接口。

问题是:如何选择仅在一个特定组中的对象(例如gid = 4)?

这只会得到一部分结果:

WHERE gr.id = 4


要么

HAVING gr.id = 4


任何帮助,不胜感激! (也许还有一种更优雅的方式来配合)

最佳答案

如果我理解正确,则希望获取组4中的所有对象,以及这些对象所在的所有组。您想要在group_ref表上进行两次JOIN,一次进行过滤(常规JOIN),一次进行相关组的创建(LEFT)加入)。

SELECT o.id,
CONCAT_WS("||", GROUP_CONCAT(gx.gid separator "|"),
GROUP_CONCAT(gr.title, "#", gr.color separator "|")) AS groups
FROM objects AS o
JOIN group_ref AS gfilter ON o.id = gfilter.oid AND gfilter.gid=4
LEFT JOIN group_ref AS gx ON o.id = gx.oid
LEFT JOIN groups AS gr ON gx.gid = gr.id
WHERE 1
GROUP BY o.id

关于mysql - GROUP BY,GROUP_CONCAT,CONCAT以及如何选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9457077/

10-11 02:08