Mysql子查询优化与group by

时间:2017-11-07 11:10:22

标签: mysql group-by

我有子查询的MySQL查询 SQL fiddle

表结构是:

CREATE TABLE `wildberries` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `brand` VARCHAR(50) NULL DEFAULT NULL,
    `subject` VARCHAR(50) NULL DEFAULT NULL,
    `article` VARCHAR(50) NULL DEFAULT NULL,
    `size` VARCHAR(50) NULL DEFAULT NULL,
    `color` VARCHAR(50) NULL DEFAULT NULL,
    `income` INT(11) NULL DEFAULT NULL,
    `income_sum_price` VARCHAR(50) NULL DEFAULT NULL,
    `ordered` VARCHAR(50) NULL DEFAULT NULL,
    `ordered_sum_price` VARCHAR(50) NULL DEFAULT NULL,
    `ordered_max_by_day` VARCHAR(50) NULL DEFAULT NULL,
    `return_before_payment` VARCHAR(50) NULL DEFAULT NULL,
    `return_before_payment_sum_price` VARCHAR(50) NULL DEFAULT NULL,
    `sales_by_payment` INT(11) NULL DEFAULT NULL,
    `sales_by_payment_sum_price` VARCHAR(50) NULL DEFAULT NULL,
    `return` INT(11) NULL DEFAULT NULL,
    `return_sum_price` VARCHAR(50) NULL DEFAULT NULL,
    `stock` VARCHAR(50) NULL DEFAULT NULL,
    `source_file` VARCHAR(50) NULL DEFAULT NULL,
    `from` DATE NULL DEFAULT NULL,
    `end` DATE NULL DEFAULT NULL,
    `clear_article` VARCHAR(50) NULL DEFAULT NULL,
    `user_id` INT(11) NULL DEFAULT NULL,
    `file_hash` VARCHAR(50) NULL DEFAULT 'sha1(concat(user_id, source_file))',
    PRIMARY KEY (`id`),
    INDEX `from` (`from`),
    INDEX `end` (`end`),
    INDEX `size_color_clear_article` (`size`, `color`, `clear_article`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

查询是:

SELECT wildberries.clear_article AS clear_article, wildberries.color AS color, wildberries.size AS size, (
SELECT w2.stock
FROM wildberries w2
WHERE w2.clear_article = wildberries.clear_article AND w2.color = wildberries.color AND w2.size = wildberries.size
ORDER BY w2.from DESC
LIMIT 1) AS stock
FROM wildberries
GROUP BY clear_article , color, size
ORDER BY `from` DESC

此查询为我提供了正确的值(最新产品日期的库存)。

但是这个查询太慢了。我试图添加索引 - 没有结果。

主要思想是:对于每种产品(与clear_article,尺寸和颜色相结合)获取最新的“来自”并获得“库存”。

有人可以给我建议 - 是否可以在没有子查询的情况下重写此查询?

更新:样本数据在桌面上。

1 个答案:

答案 0 :(得分:0)

为什么要在同一个表格中进行子选择,如果您首先检索已经存在的值? 您所拥有的简化版

SELECT clear_article, color, size, stock
FROM wildberries
ORDER BY wildberries.from DESC