查询优化-使用SQL有效地整理一对多关系表的结果

Aadarshsg

我正在尝试合并一对多表。我想一起显示一个项目的变体。这必须完全在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
sqluser

尝试这个:

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章