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