/ / DISTINCTが重複した列値をプルする-SQL、結合、個別、内部結合

DISTINCT重複カラム値を引き出す - SQL、結合、別個、内部結合

次のクエリは重複をプルしています site_ids、DISTINCTを使用している場合、「理由がわからない」

SELECT
DISTINCT site_id,
deal_woot.*,
site.woot_off,
site.name AS site_name
FROM deal_woot
INNER JOIN site ON site.id = site_id
WHERE site_id IN (2, 3, 4, 5, 6)
ORDER BY deal_woot.id DESC LIMIT 5

回答:

回答№1は2

DISTINCT を見て 全体 直後の列だけでなく、レコード。あなたが望むものを達成するには、あなたが使用する必要があります GROUP BY

機能していないコード:

SELECT
site_id,
deal_woot.*,
site.woot_off,
site.name AS site_name
FROM deal_woot
INNER JOIN site ON site.id = site_id
WHERE site_id IN (2, 3, 4, 5, 6)
GROUP BY site_id

なぜ機能しないのですか? GROUP BY 列の場合は、集計関数(次のような MIN または MAX)残りの列-それ以外の場合、複数ある場合 site_woot_off与えられた site_id、それはSQLには明確ではありません それらの値のどれ あなたはしたい SELECT.

おそらく拡張する必要があります deal_woot.* 各フィールドをリストします。

サイドノート: 「MySQLを使用している場合、残りの列に集計関数を指定することは技術的に必要ではないと思います。列の集計関数を指定しない場合、単一の列値(通常は結果セットの最初の値)が選択されます。


回答№2については2

クエリが返されています DISTINCT 行、それは見ているだけではありません site_id。つまり、いずれかの列が異なる場合、このクエリから新しい行が返されます。

これは理にかなっています。実際に違いがある場合は、サーバーが値として何を返すか deal_woot.* ?これを行うには、これを指定する必要があります-おそらく、 site_id「s、その後取得 LIMIT 1 適切なサブクエリ内の他の値の ORDER BY 句。


回答№3の場合は0

1つのテーブルからのみ異なる値を選択しています。他のテーブルと結合すると、他のテーブルから独自の値のそれぞれに一致するすべての行がプルされ、IDが重複します


回答№4の場合は0

同じsite_idを使用してサイト情報とdeal_wootテーブルから単一の行を選択する場合は、別のクエリを使用する必要があります。例えば、

SELECT site.id, deal_woot.*, site.woot_off, site.name
FROM site
INNER JOIN
(SELECT site_id, MAX(id) as id FROM deal_woot
WHERE site_id IN (2,3,4,5,6) GROUP BY site_id) X
ON (X.site_id = site.id)
INNER JOIN deal_woot ON (deal_woot.id = X.id)
WHERE site.id IN (2,3,4,5,6);

このクエリは、SQLダイアレクト/ DBベンダーに関係なく機能するはずです。 mysqlの場合は、追加するだけです group by site_id 使用できるため、元のクエリに GROUP BY 集約関数なし。
** deal_woot.id そして site.id の主キーです deal_woot そして site それぞれテーブル。