2012-03-07 20 views
2

これらはどちらも動作しますが、これを書き込むにはより良い方法がありますか?最も効率的なSQL、DISTINCT、WHERE ... AND

1.

SELECT asset_id, 
     asset.category_id, 
     x, 
     y 
FROM asset 
INNER JOIN map_category 
ON map_category.category_id = asset.category_id 
WHERE asset.map_id = 5 
AND map_category.map_id = 5 

2.DISTINCTを追加しましたし、最後の行を削除)

SELECT DISTINCT asset_id, 
     asset.category_id, 
     x, 
     y 
FROM asset 
INNER JOIN map_category 
ON map_category.category_id = asset.category_id 
WHERE asset.map_id = 5 

DISTINCTまたは最後の行AND map_cate...どちらかがなければ、私は3つのレコードを取得します。それぞれに1つ:

map_categoryテーブル

map_category

資産テーブル

asset

+2

EXPLAINはあなたの友達です:http://dev.mysql.com/doc/refman/5.0/ en/explain.html –

+0

これらのクエリは同義ではなく、同じ結果をもたらす場合は偶然です。あなたは達成しようとしていることを説明していないので、より効率的な代替案を提案することは困難です。 – GarethD

+0

私は外国人のキーが2つの列で構成されているとは誰も信じられません:( – Aprillion

答えて

4

これらの2つのクエリは完全に異なることを行います。 DISTINCTは一意のasset_idの行のみを選択し、別のクエリはasset.map_id = 5の行のみを選択します。

同じ結果を得たのはあなたのデータです。他のデータでは、全く異なる結果になります。したがって、効率を比較することはできません。

2

あなたの外部キーが列の両方で構成されているので、あなたは、両方の列に参加する必要がありますが...

SELECT asset_id, 
    asset.category_id, 
    x, 
    y 
FROM asset 
INNER JOIN map_category 
ON map_category.category_id = asset.category_id 
AND asset.map_id = map_category.map_id 
+0

あなたはそれを行うことができるか分かりませんでした! –

関連する問題