次の(おそらく古くなった)問題の適切な解決策を見つけることができないようです。 mySQLで他の非一意の列とともに1つの個別の列を返す必要があります。
MySQLに次の表があります。
id name destination rating country
----------------------------------------------------
1 James Barbados 5 WI
2 Andrew Antigua 6 WI
3 James Barbados 3 WI
4 Declan Trinidad 2 WI
5 Steve Barbados 4 WI
6 Declan Trinidad 3 WI
国に基づいて評価する宛先と一緒にDISTINCT名を返すSQLステートメントが欲しい。
id name destination rating country
----------------------------------------------------
1 James Barbados 5 WI
2 Andrew Antigua 6 WI
4 Declan Trinidad 2 WI
5 Steve Barbados 4 WI
ご覧のとおり、JamesとDeclanの評価は異なりますが、同じ名前なので、1回だけ返されます。
次のクエリは、評価が異なるため、すべての行を返します。とにかく上記の結果セットを返すことができますか?
SELECT (distinct name), destination, rating
FROM table
WHERE country = 'WI'
ORDER BY id
サブクエリを使用すると、名前ごとに最高のid
を取得し、それに基づいて残りの行を選択できます。
_SELECT * FROM table
WHERE id IN (
SELECT MAX(id) FROM table GROUP BY name
)
_
希望する場合は、MIN(id)
を使用して、最後ではなく各名前の最初のレコードを取得します。
サブクエリに対して_INNER JOIN
_を使用して行うこともできます。この目的のために、パフォーマンスは類似している必要があり、場合によっては、サブクエリのtwo列で結合する必要があります。
_SELECT
table.*
FROM
table
INNER JOIN (
SELECT MAX(id) AS id FROM table GROUP BY name
) maxid ON table.id = maxid.id
_
問題は、最初のフィールドだけでなく、戻り値セット全体で個別に機能することです。そうしないと、MySQLはどのレコードを返すかを知りません。したがって、MAX、MIN、GROUP_CONCAT、AVG、または他のいくつかの関数に関係なく、評価に関する何らかのグループ関数が必要です。
マイケルはすでに良い答えを投稿しているので、クエリを書き直すつもりはありません。
group by
:
select min(id) as id, name, destination, avg(rating) as rating, country from TABLE_NAME group by name, destination, country
@rcdmkに同意します。 DEPENDENTサブクエリを使用すると、パフォーマンスが低下する可能性があります。GROUPBYは、 国 フィールドと数行のみがサーバーに到達します。 @rcdmkによるクエリgibenの書き換え、 ORDER BY NULL GROUP BYによる暗黙的な順序付けを抑制し、少し速くするための句:
SELECT MIN(id) as id, name, destination as rating, country
FROM table WHERE country = 'WI'
GROUP BY name, destination ORDER BY NULL