2016-04-17 15 views
0

つのフィールドに基づいて、複数の行から1行を選択します(対応する異なる賞、私は与えられた国のリストについては、取得することができるようにしたい私はこの質問、賞のための1つの、関連テーブル持って

---------------------------------------- 
| award        | 
---------------------------------------- 
| id | name | URL | country_id | point | 
---------------------------------------- 
    1 | A | a | 1   | 120 
    2 | A | b | 0   | 60 
    3 | A | b | 2   | 80 
    4 | B | c | 0   | 50 
    5 | B | d | 1   | 70 

を同じ賞には同じ名前が付いています)、列の最高値はpointです。

私はポイントDESCでリクエストを注文し、名前でグループ化しましたが、トリックはしませんでした。ポイント数も正しいURLも得られませんでした。

私はテーブルからすべてのデータを取得し、最良のポイント数の行だけを保持することで簡単に行うことができますが、SQLだけでそれを行う方法が必要です!

私が試した要求がされた:

SELECT name, URL, point FROM award WHERE country_id IN (0,1) ORDER BY point DESC GROUP BY name 

答えて

0

これは、あなたが探している何を取得する必要があります。ここでは

SELECT t1.* FROM award AS t1 
    INNER JOIN (SELECT name, MAX(point) AS point 
     FROM award 
     WHERE country_id IN (0,1) 
     GROUP BY name) AS t2 
    ON t1.name=t2.name 
     AND t1.point=t2.point; 

は、それが故障する方法である:

これはawardに参加していますサブクエリがt2と識別されたテーブル(t1と指定されています)。サブクエリは、次のようになります。

SELECT name, MAX(point) AS point 
    FROM award 
    WHERE country_id IN (0,1) 
    GROUP BY name 

サブクエリはそれぞれの名前のためのポイントの最大量を返します。ここではサブクエリの結果は以下のとおりです。

明らか
+------+-------+ 
| name | point | 
+------+-------+ 
| A | 120 | 
| B | 70 | 
+------+-------+ 

これはURLが含まれていません。そうだった場合、URLGROUP BYになければなりません。エントリはnameURLのユニークな組み合わせになります(最大ポイント値は得られません)。

次の手順は、基本的にこの一時テーブルに参加して、一致するawardテーブルの行を取得することです。ザ参加

INNER JOIN (...) AS t2 
    ON t1.name=t2.name 
     AND t1.point=t2.point; 

はサブクエリの結果にnamepoint一致nameawardテーブル内の行を検索し、point。これにより、私たちが望む完全な行が得られます。URLにアクセスできます。結果は以下のようになります。また

+------+------+------+------------+-------+ 
| id | name | URL | country_id | point | 
+------+------+------+------------+-------+ 
| 1 | A | a |   1 | 120 | 
| 5 | B | d |   1 | 70 | 
+------+------+------+------------+-------+ 

、あなたが欲しいaward表の列で注文することができ、この時点で、たとえば名のために:

ORDER BY t1.name 

または最高点の値:

ORDER BY t1.point DESC 
+0

それは私のために働いたが、同じ名前と同じ数の点で異なる行がある場合に問題がある可能性があります:URLが間違っている可能性が(よくない行から)。 – hellimac

+0

この場合どの行を返すか(つまり、「良好な行」)グループにcountry_idを含めて参加させると、名前/国ごとに最大ポイントが得られます。それがあなたが探しているものかどうかはわかりません。 – markwatsonatx

0

あなたがポイントDESCをしたい場合は、それを試してみてください

SELECT name, country_id, point 
FROM `award` 
WHERE country_id IN (0,1) 
GROUP BY name, country_id 
ORDER BY name, point DESC 

結果

name |country_id |point 
    =====|============|=========== 
    A |1   |120 
    A |0   |60 
    B |1   |70 
    B |0   |50 
+0

私の質問は十分にはっきりしていなかったと思います。ここでの目的は、名前ごとに1つの行だけを得ることです。 – hellimac

関連する問題