Mysql 查询优化-在SQL中高效地从一对多关系表排序结果
我正在尝试将一对多表合并。我想同时显示一个项目的变量。这必须完全在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
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;