2012-08-09 73 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