一对多加入mysql

时间:2012-08-09 19:43:52

标签: 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

然而,这开始变得丑陋,并且在同一个表上进行多个连接感觉不对。有没有更有效的方法呢?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:-1)

SELECT g.SHOPPER_NAME, oi.* from GROCERIES g JOIN ORDER_INFO oi on oi.ORDER_ID=G.ORDER_ID