MySQL选择子查询

时间:2012-12-03 18:48:35

标签: mysql

我在数据库中有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。

2 个答案:

答案 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