web-dev-qa-db-ja.com

MySQLの他のいくつかの列とともに個別の列を選択します

次の(おそらく古くなった)問題の適切な解決策を見つけることができないようです。 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
28
user1038814

サブクエリを使用すると、名前ごとに最高の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
_
25

問題は、最初のフィールドだけでなく、戻り値セット全体で個別に機能することです。そうしないと、MySQLはどのレコードを返すかを知りません。したがって、MAX、MIN、GROUP_CONCAT、AVG、または他のいくつかの関数に関係なく、評価に関する何らかのグループ関数が必要です。

マイケルはすでに良い答えを投稿しているので、クエリを書き直すつもりはありません。

4
Brian Hoover

group by

select min(id) as id, name, destination, avg(rating) as rating, country from TABLE_NAME group by name, destination, country
3
Ricardo Souza

@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
2
wisefish