2016-09-15 89 views
0

我有这两个表。我会让它尽可能简单:MySQL一对多关系单查询

Sample value in main_table: 
id = 1 

Sample value in details_table: 
id = 1 
type = book 
name = harry potter 

id = 1 
type = paper 
name = post it 

我需要的结果是获得ID的名称为这两种类型。

id book   paper 
1  harry potter post it 

这是可能的吗?

回答

1

你期望的输出会暗示你想要以转动type和基于它的值列。假设可出现的唯一类型bookpaper,然后下面的查询应该工作:

SELECT t2.id, 
     MAX(CASE WHEN t2.type = 'book' THEN name ELSE NULL END) AS book, 
     MAX(CASE WHEN t2.type = 'paper' THEN name ELSE NULL END) AS paper 
FROM main_table t1 
INNER JOIN details_table t2 
    ON t1.id = t2.id 
GROUP BY t2.id 

演示在这里:

SQLFiddle

+0

什么是MAX? – aozora

+0

@aozora这是一个数据透视查询,'MAX'将保留每个透视列的非NULL值。 –

+0

谢谢,我不知道我在做什么的正确名词。现在我知道这是关键。 – aozora

2

只需加入细节表两次:

Select m.id, d1.name as book, d2.name as paper from main_table m 
join Details_table d1 on m.id =d1.id and d1.type = 'book' 
join Details_table d2 on m.id =d2.id and d2.type = 'paper' 
+0

尼斯的答案了。但我喜欢加入一次。我不知道这是否会影响更大查询的性能。还是一个很好的回答 – aozora