2013-04-22 87 views
0

我有什么:

表具有两列 水果 食品(我从中选择水果)

一每个水果,一个小尺寸,一个大尺寸。SQL:从表1分的结果多行合并2行至一个子查询

id | category | subcategory | title | description  | value 
----------------------------------------------------------------- 
1 | Fruit | Small  | Plum | Om, nom, nom!  | 0.50 
2 | Fruit | Large  | Plum | Om, nom, nom!  | 1.50 
3 | Fruit | Small  | Orange | Mmm, citrus.  | 0.30 
4 | Fruit | Large  | Orange | Mmm, citrus.  | 0.75 
5 | Fruit | Small  | Melon | Get in mah belly! | 2.00 
6 | Fruit | Large  | Melon | Get in mah belly! | 3.10 

我需要什么:

我需要两行对每个水果组合成一排:

冠军描述将始终是相同的为每一对行。

ID子类别将永远为每对行的不同。

id.r1 | id.r2 | category.r1 | title.r1 | description.r1  | subcategory.r1 | value.r1 | subcategory.r2 | value.r2 
----------------------------------------------------------------------------------------------------------------------- 
1  | 2  | Fruit  | Plum  | Om, nom, nom!  | Small   | 0.50  | Large   | 1.50 
3  | 4  | Fruit  | Orange | Mmm, citrus.   | Small   | 0.30  | Large   | 0.75 
5  | 6  | Fruit  | Melon  | Get in mah belly! | Small   | 2.00  | Large   | 3.10 

我已经试过什么:

SELECT r1.id, 
(SELECT r2.id FROM `my_table` r2 WHERE r1.title = r2.title), 
r1.category, 
r1.subcategory, 
(SELECT r2.category FROM `my_table` r2 WHERE r1.title = r2.title) 
r1.title, 
r1.description, 
r1.value, 
(SELECT r2.value FROM `my_table` r2 WHERE r1.title = r2.title) 

FROM `my_table` r1 

WHERE category = "Fruit" 

...主要生产:

子查询返回多个1行

我的问题:

如何修改上述查询以实现我所描述的内容?

回答

3

你可以很容易地做到这一点与聚合:

select category, title, description, 
     MAX(case when subcategory = 'Small' then id end) as Small_Id, 
     MAX(case when subcategory = 'Small' then value end) as Small_Value, 
     MAX(case when subcategory = 'Large' then id end) as Large_Id, 
     MAX(case when subcategory = 'Large' then value end) as Large_Value 
from my_table f 
group by category, title, description 

注:这不包括在最终结果subcategory因为该行没有子类别。

你也可以做到这一点的加盟,这似乎是你正在采取的路径:

select fsmall.id, flarge.id, fsmall.category, flarge.category, . . . 
from my_table fsmall join 
    my_table flarge 
    on fsmall.subcategory = 'small' and flarge.subcategory = 'large' and 
     fsmall.category = flarge.category and 
     fsmall.title = flarge.title and 
     fsmall.description = flarge.description 

根据是否可能有一些失踪行,你可能需要一个left outer joinfull outer join

+0

感谢您选择解决方案和每个解释。解决方案1:这很好。我明白你的意思是关于子类别。子类别的值是在ID和值的列标题中表示的。解决方案2:我无法正确直观地确认它是否有效以及生成的行是否相同。应该“水果”(类别值)不是“我的表”(表的名称)还是我的方式离开的标志?此外,是省略号(...)功能还是我假设其他列将被添加?非常感谢您的帮助。 – 2013-04-22 19:21:07

+0

@DominorNovus。 。 。我把桌子叫做'水果',但是我只是用'my_table'替换了你的问题。这是否解决您的问题? – 2013-04-22 19:23:47

+0

是的,谢谢。我修改了第二个解决方案的列选择,并在查询结尾处添加了WHERE条件。最终结果与第二种解决方案产生了完全相同的记录量。修改后的代码:http://pastebin.com/1BDfWbC9 – 2013-04-22 19:40:43