2012-12-03 148 views
0

我在数据库中有2表:mainTable和classificationTable:MySQL的选择与子查询

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(前exempla用于行与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; 

帮助PLZ。

+0

哪里是classification_name在你的桌子吗? –

+0

对不起,是我的错。是class_name –

回答

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 
+0

我明白了mainTable中的classification_id。您的解决方案完美运作感谢帮助。 –

+0

@AlexandruPara,考虑将此(或另一个)答案标记为已接受,您的分数也会上升 – amphibient

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  

一旦你这样做了,你的查询将会容易得多。