2012-03-04 8 views
9

私は2つのテーブル(国番号&アヒル)を持っています。ここでは、カントリーテーブルには世界のすべての国があり、アヒルテーブルにはカントリーフィールドにカントリーフィールドを持つアヒルのリストがあります。MySQLはジョイントテーブルの最初の行を返します

私はその中に少なくとも1匹のアヒルがある国と、その国の中で最も高い格付けをしたアヒルのアヒル表から1つの一致する記録のみを取得しようとしています。これまでのところ、私は持っています:

SELECT * 
FROM country c 
INNER JOIN ducks d ON c.id = d.country_id 
ORDER BY c.country ASC, d.rating DESC 

これは国ごとに1つだけではなくすべてのアヒルのリストを返します。

誰かが私をここで正しい方向に向けることができれば、感謝しています。私はむしろSQLでそれをするだろう各国のための別のクエリを持っている最高の定格アヒルを引き出す。

+2

参照のために参加する選択を、追加してみてください:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-これを行う方法の例については、group-in-sql /を参照してください。 – imm

+0

あなたはどれをお望みですか?ただの誰ですか? – dotoree

+1

@dotoree最高の定格(最高のアヒルからのセット) –

答えて

19
​​

インデックスを(country_id, rating, id)にMyISAMテーブルの場合は(country_id, rating)、InnoDBテーブルの場合は(country_id, rating) ouldヘルプ。

このクエリでは、同じ評価を持つ複数の国がある場合でも、国ごとに1つだけduckが表示されます。タイのレーティングを持つアヒルを欲しい場合は、@ immのGROUP BY答えを使用してください。

+0

それは完璧に動作していただきありがとうございます –

+0

@ immのanwerも大丈夫です。 –

+0

+1とてもいいです。サブクエリなしでこれを達成することは可能ですか? –

-1

多くのデータベースには、「select top 10 * from ...」と同等のものがあります。 mySqlでは、構文は "select * from ... limit 10"になります。この場合

...しかし...

、uouは本当にと "MAX()" "でグループを" 欲しいです!

+1

こんにちは、グループは結果を制限しますが、MAX()関数はグループの最大値を表示しますが、残りの行には最大レーティングではなくMySQLが最初に見つけたレコードです。これは私がこれまで行ってきたことです: 'SELECT c。*、d。*、MAX(d.rating) FROM国c INNER JOIN ducks d ON c.id = d.country_id GROUP BY c.country ORDER BY c.country ASC、d.rating DESC' –

0

これを試してみてください:

SELECT c.country, MAX(d.rating) AS max_rating 
FROM country c 
JOIN ducks d ON c.id = d.country_id 
GROUP BY c.id 
ORDER BY c.country ASC 

を "最高の評価は" 1であれば、MIN(d.rating)

+0

こんにちは、それは非常に近いです、それは最大の格付けを持つ単一の国を返します、私はまた、その最大格付けに対応するレコードを返そうとしています。例えば、あなたのコードの最初の行を 'SELECT c.country、d.id、d.rating、MAX(d.rating)'に変更した場合、d.ratingはMAX(d.rating)と常に同じではないsense –

+0

はい、そうです。私は答えを更新しました。もう一度やり直してください。 –

+0

@Bruni: 'ORDER BY'の後の' HAVING'は有効な構文ではありません。 –

3

MAX(d.rating)を変更するには、試してみてください:

SELECT c.*, d.* 
FROM country c 
INNER JOIN (
    SELECT d.country_id, d.id, MAX(d.rating) AS rating 
    FROM ducks d 
    GROUP BY d.country_id 
) q ON (q.country_id = c.id) 

INNER JOIN ducks d 
    ON (d.country_id, d.rating) = (q.country_id, q.rating) 
+0

これは、アヒルの詳細を表示するためにもう一度参加する必要があります: 'INNER JOIN ducks d ON(d.country_id、d.rating)=(q.country_id、q.rating)' –

+0

@ ypercube、真実。 – imm

8

あなただけ

SELECT c.*, d.* 
FROM country c 
INNER JOIN ducks d ON c.id = d.country_id 
LEFT JOIN ducks d2 ON d.country_id = d2.country_id AND d2.rating > d.rating 
WHERE d2.id IS NULL 
+0

素晴らしい!私はこのバージョンが好きです。 –

+1

そして 'SELECT c。*、d。*'を持つ方が良いでしょう。 'd2。*'列を含める必要はありません。すべてNULLになります。 –

+1

これは受け入れられる回答でなければなりません – ScottG

関連する問題