查询优化 - 在SQL中有效地从一对多关系表中整理结果

时间:2015-07-24 06:05:04

标签: mysql sql performance optimization

我正在尝试组合一对多表。我想一起显示一个项目的变体。这必须完全在SQL中完成。

以下是示例模式

CREATE TABLE ItemVariant (`item_id` int, `variant_id` int, `variant` varchar(55), `variant_order` int);
INSERT INTO ItemVariant (`variant_id`, `item_id`, `variant`, `variant_order`)
VALUES
    (1, 1, 'I1V1', 1),
    (2, 1, 'I1V2', 2),
    (3, 1, 'I1V3', 3),
    (4, 2, 'I2V1', 1)
;

CREATE TABLE Item (`item_id` int, `item` varchar(55));
INSERT INTO Item (`item_id`, `item`)
VALUES (1,'I1'), (2,'I2');

这是一个工作查询,它​​提供了我所需要的。 SQLFiddle

SELECT Item.item, iv1.variant, iv2.variant, iv3.variant from Item
LEFT JOIN ItemVariant iv1 ON (Item.item_id = iv1.item_id and iv1.variant_order=1)
LEFT JOIN ItemVariant iv2 ON (Item.item_id = iv2.item_id and iv2.variant_order=2)
LEFT JOIN ItemVariant iv3 ON (Item.item_id = iv3.item_id and iv3.variant_order=3)

但是,正如您所看到的,我必须访问ItemVariant表3次,因此效率不高。我想过使用group by,但我无法查询由group by组成的群组。

这是我为分组所尝试的内容。 SQLFiddle

SELECT 
*, 
case when variant_order=1 then variant end as variant1,
case when variant_order=2 then variant end as variant2,
case when variant_order=3 then variant end as variant3
from  ItemVariant
GROUP BY item_id

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT Item.item, 
       MAX(case when variant_order=1 then variant end) as variant1,
       MAX(case when variant_order=2 then variant end) as variant2,
       MAX(case when variant_order=3 then variant end) as variant3
from ItemVariant
LEFT JOIN Item ON Item.item_id = ItemVariant.item_id
GROUP BY Item.item;

答案 1 :(得分:0)

SELECT  i.item,
        GROUP_CONCAT(v.variant
                     ORDER BY  v.variant_order
                     SEPARATOR ', ' ) AS Variants
    FROM  Item AS i
    JOIN  ItemVariant as v  ON v.item_id = i.item_id
    GROUP BY  i.item;