【发布时间】:2015-09-04 20:05:21
【问题描述】:
我的表结构如下:
CREATE TABLE IF NOT EXISTS `products` (
`id_product` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_product`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
CREATE TABLE IF NOT EXISTS `products_vars` (
`id_product` int(10) unsigned NOT NULL,
`id_product_var` int(10) unsigned NOT NULL AUTO_INCREMENT,
`price` decimal(7,2) NOT NULL,
`discount` tinyint(3) unsigned NOT NULL DEFAULT '0',
`stock` smallint(6) NOT NULL DEFAULT '0',
`coming_soon` enum('y','n') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'n',
`date_add` datetime DEFAULT NULL,
`date_update` datetime DEFAULT NULL,
`active` enum('y','n') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'n',
PRIMARY KEY (`id_product_var`),
KEY `id_product` (`id_product`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
ALTER TABLE `products_vars`
ADD CONSTRAINT `products_vars_ibfk_1` FOREIGN KEY (`id_product`) REFERENCES `products` (`id_product`) ON DELETE CASCADE ON UPDATE CASCADE;
我需要获得具有正确 ID 的最便宜的产品,下面的查询运行良好,但我认为它有点慢,所以我想知道是否有其他方法。
SELECT p.id_product, pv.coming_soon, pv.date_add, pv.price * (1 - (pv.discount / 100)) AS price, MAX(pv.stock) AS stock, MAX(pv.date_add) AS date_add
FROM products AS p
INNER JOIN products_vars AS pv USING(id_product)
INNER JOIN (SELECT pv.id_product, MIN(pv.price * (1 - (pv.discount / 100))) AS min_price
FROM products_vars AS pv
WHERE pv.active = 'y'
GROUP BY pv.id_product) AS pv2
ON pv2.id_product = pv.id_product
AND min_price = pv.price * (1 - (pv.discount / 100))
WHERE pv.active = 'y'
GROUP BY pv.id_product
最后一件事:表格“products_vars”可以包含产品的多种变体(颜色或尺寸),判断其中至少一个是否有"coming_soon" = "n"的最佳方法是什么?
【问题讨论】:
-
这个问题在 SO 上已经被问了很多次(糟糕地)。它不是重复的,因为答案通常不同。但是,如果您阅读之前的一些问题和评论,您会发现如果不至少提供 EXPLAIN 计划和表格结构,就无法回答这个问题。
-
感谢 symcbean 的回复。相信,我检查了几个线程,但没有找到我的问题的答案!也许你骗我指向其中的一些!
表结构正是我给出的,但没有所有列时稍微简化了... -
请为每张桌子提供
SHOW CREATE TABLE。 -
嗨 Rick,我已经更新了我的初始消息。谢谢
-
@Websphere 请提供您的实际查询,而不是
...和WHERE CONDITION。这些细节对于与性能相关的问题极为重要。您选择或过滤的每一列都会对性能产生影响。另外,请修正表定义以实际显示SHOW CREATE TABLE product_vars的结果。该语句中的 PRIMARY KEY 列甚至不存在于您的表中。
标签: mysql query-optimization inner-join query-performance