JOIN
これまで扱ったことのない方法で、を実行し、2つの列を一緒にソートするSQLクエリを作成するのに数時間を費やしました。クエリは次のとおりです。
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
1つはmerchant_categoryテーブルから、もう1つはmerchantテーブルから、2つの列を一緒に並べ替えて、一緒に並べ替える必要があります。の各行にはmerchant
、テーブルで直接参照される「プライマリ」カテゴリと、テーブルに格納されている0個以上の「セカンダリ」カテゴリがありmerchant_category
ます。今では正常に動作しますが、非常に低速です。通常、本番データベースでは1分以上かかります。プラスJOIN
複雑な並べ替えが問題を引き起こしていると思いますが、どうすればよいですか?
編集これが2つのテーブルのスキーマです。
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`)
)