我在数据库中有2个表:mainTable和classificationTable:
mainTable:
id | classification_id | name
---------------------------------------
1 | 1 | Name1
2 | 2,3,4 | Name2
3 | 1,4 | Name3
4 | 4 | Name4
classificationTable:
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
我尝试这个选择,但这只返回数组中的第一个elemnt(前面的示例为ID为3的行,这只返回Class Name1)
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;
帮助PLZ。
答案 0 :(得分:1)
问题在于mainTable
,不仅违反the 1st normal form ,而且甚至超出了因为它在同一字段中连接值(1NF违规的教科书示例通常包括多个字段,这已经够糟了)。
classification_id
列不应该是值的串联,但是您应该有一个新表,其中每个classification_id都有一个单独的行,它应该通过id绑定到mainTable。
E.g。
id | classification_id
---------------------------------------
1 | 1
2 | 2
2 | 3
2 | 4
3 | 1
3 | 4
4 | 4
完成后,您的查询会更容易。
答案 1 :(得分:1)
是的,你的数据库设计很差。但你可以做你想做的事。
这需要两个步骤。第一种方法是通过在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