我有两张桌子。一张桌子看起来像

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,MIRK_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


但是,这开始看起来很丑陋,并且在同一张表上进行多个联接并不适合。有更有效的方法吗?

谢谢!

最佳答案

您可以在第2个表上使用数据透视表对其进行一定程度的非规范化,也可以通过稍微对其进行规范化来更改数据库体系结构。在堆栈溢出中查找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

10-07 17:26