DISTINCT と ORDER BY を一緒に使う時の、PostgresとMySQLの違い
例えば items というようなテーブルがあって、id と name がある。
id | name ----+-------- 1 | test 2 | sampleで、この items には複数のカテゴリーとサブカテゴリーが紐づけられている。
紐づけ用のテーブルは items_categories というようなもので、こんな感じになっている。
item_id | category_id | sub_category_id | orders ---------+-------------+-----------------+-------- 1 | 1 | 1 | 2 1 | 1 | 2 | 2 2 | 1 | 2 | 1アイテム1はサブカテゴリー1と2に、アイテム2はサブカテゴリー2に紐付いていて、どちらもカテゴリーは1だが、
そのカテゴリー1の中での並ぶ順番が orders ということで設定されている。
アイテム2が順番は1、アイテム1が2番と。
で、こいつをまず順番関係なしに、join してみると
SELECT ic.item_id, i.name FROM items_categories ic INNER JOIN items i ON ic.item_id=i.id WHERE ic.category_id=1こうなる。
item_id | name ---------+-------- 1 | test 1 | test 2 | sampleorders 順にしたいので、
SELECT ic.item_id, i.name FROM items_categories ic INNER JOIN items i ON ic.item_id=i.id WHERE ic.category_id=1 ORDER BY ic.ordersとすると、
item_id | name ---------+-------- 2 | sample 1 | test 1 | testこれは動く。item_id が重複してるので、distinct を使うと、
SELECT DISTINCT ic.item_id, i.name FROM items_categories ic INNER JOIN items i ON ic.item_id=i.id WHERE ic.category_id=1 ORDER BY ic.ordersPostgresの場合、エラーになる。
ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select listMySQLの場合、
item_id | name ---------+-------- 2 | sample 1 | test出る。
Postgresでも
SELECT DISTINCT ic.item_id, i.name, ic.orders FROM items_categories ic INNER JOIN items i ON ic.item_id=i.id WHERE ic.category_id=1 ORDER BY ic.ordersとすればちゃんと出る。
item_id | name | orders ---------+--------+-------- 2 | sample | 1 1 | test | 2そりゃ、おかしいのはMySQLでしょう。この場合。