0

我在数据库中有 2 个表:mainTable 和分类表:

主表:

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 的行的示例,仅返回 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。

4

2 回答 2

1

问题是 your mainTable,它不仅违反了第一范式,而且甚至超出了因为它连接了同一字段中的值(教科书上违反 1NF 的示例通常包括多个字段,这已经够糟糕了)。

classification_id列不应该是值的串联,但您应该有一个新表,其中每个分类 ID 都有一个单独的行,并且它应该通过 id 绑定到 mainTable。

例如

id  |   classification_id   
---------------------------------------
1   |           1           
2   |           2           
2   |           3         
2   |           4           
3   |           1       
3   |           4     
4   |           4    

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

于 2012-12-03T18:53:46.523 回答
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
于 2012-12-03T19:16:03.247 回答