0

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`)
)
4

2 に答える 2

2

2番目のテーブルに外部キー制約を追加してみてください。

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`),
  CONSTRAINT mc_fk FOREIGN KEY (`merchant_id`) REFERENCES `merchant`(`id`)
)
于 2012-09-18T01:17:41.863 に答える
1

LEASTソートするために、行ごとに(2回!)強制的に実行しています。これにはインデックスを使用できません。

于 2012-09-18T00:56:34.937 に答える