2012-08-09 49 views
1

我有两张表。一台看起来像一对多加入mysql

ORDER_ID | SHOPPER_NAME | DATE 
------------------------------- 
001A  | Marianna  | 08/09/2012 
002A  | Jason  | 80/08/2012 

,并具有顺序

ORDER_ID | DATA_CODE | DATA_VALUE 
---------------------------------- 
001A  | MILK_MONEY | 1.20 
001A  | NUM_EGGS | 22 
002A  | TOTAL_SPENT | 32.43 
001A  | TOTAL_SPENT | 42.13 

我需要得到一些数据代码的特定顺序的信息另一个表。如何在一行中选择SHOPPER_NAME,MILK_MONEY(DATA_VALUE,其中DATA_CODE ='MILK_MONEY'),TOTAL_SPENT和NUM_EGGS?我有工作在那里我做3加入像

SELECT SHOPPER_NAME, 
     MILK.DATA_VALUE, 
     EGGS.DATA_VALUE, 
     TOTAL.DATA_VALUE 
FROM GROCERIES G 
JOIN ORDER_INFO MILK ON MILK.ORDER_ID=G.ORDER_ID 
JOIN ORDER_INFO EGGS ON EGGS.ORDER_ID=G.ORDER_ID 
JOIN ORDER_INFO TOTAL ON TOTAL.ORDER_ID=G.ORDER_ID 

然而,这开始看起来丑陋,它不觉得权利被进行多次在同一个表连接。有没有更有效的方法来做到这一点?

谢谢!

回答

0

你可以在你的第二个表上使用一个数据透视表使其非规格化,或者你可以通过非规范化它来改变你的数据库结构。在堆栈溢出中查找MySQL PIVOT以获取更多示例,但是像这样:

SELECT * FROM 
(SELECT ORDER_ID, DATA_CODE, DATA_VALUE FROM tablename 
PIVOT (sum(DATA_VALUE) FOR DATA_CODE IN ([MILK_MONEY], [NUM_EGGS], [TOTAL_SPENT])) pvt 
-1
SELECT g.SHOPPER_NAME, oi.* from GROCERIES g JOIN ORDER_INFO oi on oi.ORDER_ID=G.ORDER_ID 
+0

这不起作用。它向我返回许多行,对于每个订单,它为每个DATA_CODE返回一行。这个例子是简化的,但我真的有大约35个数据代码 – Marianna 2012-08-09 19:59:40

0
SELECT SHOPPER_NAME, 
     (select sum(DATA_VALUE) from ORDER_INFO where DATA_CODE = 'MILK_MONEY' and ORDER_ID = G.ORDER_ID) as 'MilkValue' 
     (select sum(DATA_VALUE) from ORDER_INFO where DATA_CODE = 'NUM_EGGS' and ORDER_ID = G.ORDER_ID) as 'EggsValue' 
     (select sum(DATA_VALUE) from ORDER_INFO where DATA_CODE = 'TOTAL_SPENT' and ORDER_ID = G.ORDER_ID) as 'TotalSpentValue' 
FROM GROCERIES G 

使用subquerys让每个总和(我不知道是否有更多的一列或者有牛奶总量,鸡蛋等;在这种情况下,删除sum's) 每个总和将为每个Order_Id

+0

这是否比连接更高效? – Marianna 2012-08-09 19:56:52

+0

考虑到您在同一列中有信息,您很可能需要执行一次以上的加入;也许可以用Data_Code的一个案例来完成,但我不确定是否有可能(并且我在工作中,也许以后我可以尝试它) – 2012-08-09 20:01:20