我在数据库中有2个表:mainTable和classificationTable:
主表:
id | classification_id | name
---------------------------------------
1 | 1 | Name1
2 | 2,3,4 | Name2
3 | 1,4 | Name3
4 | 4 | Name4
分类表:
classification_id | class_name
---------------------------------------
1 | Class Name1
2 | Class Name2
3 | Class Name3
4 | Class Name4
我想从 mainTable 中选择 ID 为 3 的行,例如:
id = 3
class_name = Class Name1, Class Name4
Name = Name3
我尝试此选择,但这仅返回数组中的第一个元素(例如,对于 ID 为 3 的行,这仅返回类名称 1)
SELECT i.*,
(SELECT GROUP_CONCAT(cl.class_name) FROM classificationTable as cl WHERE cl.classification_id IN(i.classification_id)) as class_name
FROM mainTable as i;
请帮忙。
最佳答案
是的,您的数据库设计得很糟糕。但你可以做你想做的事。
这需要两个步骤。第一种方法是通过查找 mainTable 列表中的每个classification_id 将 mainTable 连接到classificationTable。您可以使用 like
运算符来执行此操作。
第二步是将所有类名放回到一列中。这是使用 group_concat
处理的。
以下查询完成此操作(尽管尚未经过测试,因此可能有拼写错误):
select mt.id, mt.name, group_concat(ct.class_name separator ', ')
from mainTable mt join
classificationTable ct
on concat(',', classification_id, ',') like concat('%,', ct.classification_id, ',%')
group by mt.id, mt.name
关于MySQL 使用子查询选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689701/