【发布时间】:2012-09-18 00:43:11
【问题描述】:
我花了几个小时制作一个 SQL 查询,它执行 JOIN 并将两列排序在一起,这是我以前没有处理过的。这是查询:
SELECT `m`.`id`, `m`.`primary_category_id`, `m`.`primary_category_priority`, `m`.`description`
FROM (`merchant` AS m)
LEFT JOIN `merchant_category`
ON `merchant_category`.`merchant_id` = `m`.`id`
WHERE
`merchant_category`.`category_id` = '2'
OR `m`.`primary_category_id` = '2'
GROUP BY `m`.`id`
ORDER BY
LEAST(merchant_category.priority = 0, `primary_category_priority` = 0) ASC,
LEAST(merchant_category.priority, `primary_category_priority` ) ASC
LIMIT 10
它必须将两列排序在一起,一列来自 Mercer_category 表,一列来自商人表,以便它们被排序在一起。 merchant 的每一行都有一个“主要”类别,直接在表中引用,零个或多个“次要”类别,存储在merchant_category 表中。现在它工作正常,但速度很慢:通常在我的生产数据库上超过一分钟。我想JOIN 加上复杂的排序是导致问题的原因,但我该怎么办?
编辑这是两个表的架构:
CREATE TABLE IF NOT EXISTS `merchant` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) CHARACTER SET utf8 NOT NULL,
`primary_category_id` int(11) NOT NULL,
`primary_category_priority` int(10) unsigned NOT NULL DEFAULT '0',
`description` mediumtext CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE IF NOT EXISTS `merchant_category` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`merchant_id` int(10) NOT NULL,
`category_id` int(10) NOT NULL,
`priority` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
【问题讨论】:
-
你能把表的架构专门贴出来
merchant和merchant_category吗?也许你错过了一些索引.. -
您是否正确设置了索引?两张表有多少行?
-
@Erik
merchant我相信有超过 20,000 个,merchant_category有好几倍。 -
@JohnWoo 我添加了表模式。
标签: mysql sql join sql-order-by