Mysql 查询优化-在SQL中高效地从一对多关系表排序结果

Mysql 查询优化-在SQL中高效地从一对多关系表排序结果,mysql,sql,performance,optimization,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, 'I

我正在尝试将一对多表合并。我想同时显示一个项目的变量。这必须完全在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');
下面是一个工作查询,它提供了所需的内容

但是,正如您所看到的,我必须访问
ItemVariant
表3次,因此,它没有效率。我曾想过使用
groupby
,但我无法在
groupby
组成的组中进行查询

以下是我为分组所做的尝试

试试这个:

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;

有什么证据证明原始查询是“无效的”?(由于缺少索引和不可搜索的查询,两者都不一定“高效”)我有一个这样构造的查询,它需要40分钟来处理生产数据!这是主要嫌疑犯之一。
Item
ItemVariant
有哪些索引?此外,这个问题是否与MySQL或SQL Server有关?如果您希望以这种方式使用数据(将行旋转到列…,在不存在数据的情况下保留空值),为什么表的结构不是这样?如果您希望确保这就是查询需要40分钟的原因,请将其删除。使用一个(左)连接,让输出“unpivoted”,看看这是否会将执行时间缩短到可接受的持续时间。如果没有,就开始寻找其他地方
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
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;
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;