MySQL:如何使用分配表在一个查询中连接三个表?

问题描述:

我有三个表:MySQL:如何使用分配表在一个查询中连接三个表?

ITEMS 
itemid | itemname 
1  | Item 1 

FEATURES 
featureid | featurename 
1   | feature1 
2   | feature2 
3   | feature3 
4   | feature4 
...  | ... 

ASSIGN 
assignid | itemid | featureid 
1  | 1  | 1 
1  | 1  | 2 
1  | 1  | 3 
1  | 1  | 4 

我想要一个查询,这将使我类似这样的结果:

ITEMS 
itemid | itemname | featurename1 | featurename2 | etc 
1  | Item 1 | feature1  | feature2  | etc 

有没有办法做到这一点,而无需第二个查询?我发誓我只是以错误的方式思考它?有任何想法吗?

注意:功能可以是0到50种不同功能的任何功能。我的数据库设计可能是错误的?

+0

[见这也许有用(http://stackoverflow.com/questions/5196371/sql-query-concatenating-results-into-one-string) – mojtaba 2013-04-25 18:52:16

+0

如果项目只有例如。 featureid 3和4分配给它(但不是1或2),那么你希望它的特性出现在'featurename3'和'featurename4'(匹配featureid)列中,或者在'featurename1'和'featurename2'列中出现。从左到右填充列)? – 2013-04-25 19:00:35

+1

为什么所有'assignid'值'1'?这是一个错字吗? – 2013-04-25 19:01:54

链接他们使用ASSIGN表,然后你可以使用GROUP_CONCAT()做你想要什么。试试这个:

SELECT 
    ITEMS.itemid, 
    ITEMS.itemname, 
    FEATURES.featureid, 
    GROUP_CONCAT(FEATURES.featurename) AS FEATURES 
FROM ITEMS 
JOIN ASSIGN ON ITEMS.itemid = ASSIGN.itemid 
JOIN FEATURES ON FEATURES.featureid = ASSIGN.featureid 

SQL Fiddle link

只需使用ASSIGN表作为ITEMS和FEATURES的交叉参考。因此,通过在ASSIGN表的外键,像这样一起加入了一切:

SELECT 
    ITEMS.itemid 
, ITEMS.itemname 
, FEATURES.featureid 
, FEATURES.featurename 
, ASSIGN.assignid 
FROM `ITEMS` 
JOIN `ASSIGN` 
    ON ITEMS.itemsid = ASSIGN.itemid 
JOIN `FEATURES` 
    ON FEATURES.featureid = ASSIGN.featureid