2017-01-03 18 views
1

私は現在サッカーのウェブサイトで作業しています。私が開発している機能は、どのプレーヤーが毎年多くのゴールを決めたかを見るために歴史を経ています。ORDER BY MAX( `field_name`)GROUP BYを使用して

私は実用的な解決策を持っていますが、より簡単で効率的な方法があると思います。ここで

は、いくつかの例のデータである:

次のクエリを使用して
----------------------- 
year | name | goals 
----------------------- 
    1 | player1 | 6 
    1 | player2 | 8 
    1 | player3 | 4 
    2 | player1 | 3 
    2 | player2 | 5 
    2 | player3 | 2 
    3 | player1 | 7 
    3 | player2 | 7 
    3 | player3 | 3 

、私は私が必要とするデータの一部を取得することができています。

SELECT year、MAX(goals)私が使用して過ごしていますように、しかしより困難証明してname列から正しい値を取得する年

------------ 
year | goals 
------------ 
    1 | 8 
    2 | 5 
    3 | 7 

`BY tableグループからgoals AS year 3のようなインスタンスの場合はがgoalsの最大値に等しい場合はGROUP_CONCATとなります。

現在、私は希望の結果を得るために2つのクエリを使用しています。私はまだ上記のクエリを使用していますが、PHP whileループを使用して毎年個別に検索しています。

は、ここに私のコードです:

$load_goals = $db->query("SELECT `year`, MAX(`goals`) AS `goals` FROM `table` GROUP BY `year` DESC); 

while($goals = $load_goals->fetchObject()) 
{ 
    $players = $db->prepare("SELECT `year`, GROUP_CONCAT(`name` ORDER BY `name`) AS `name`, `goals` FROM `table` WHERE `year` = :year AND `goals` = :goals"); 
} 

私は1つにしかし無駄に2つのクエリを結合しようとしたので、ここで任意の指導をいただければ幸いです。

明確にするために、これが私の最終的な結果になるはずです。 3年目に何が起こるかをご確認ください。ここではGROUP_CONCATが配信されています。

------------------------------ 
year | name   | goals 
------------------------------ 
    1 | player2   | 8 
    2 | player2   | 5 
    3 | player1,player2 | 7 
+0

見逃している二重引用符がありますか?シンタックスカラーリングはヒントを与えるはずです! – RiggsFolly

+0

ここで明らかな構文エラーは、私がサイトに初めて入り込んだことと、コードと見積もりシステムに適応していることにまさにあります。 私の問題を解決する以下の回答が提供されています。回答いただきありがとうございます。 –

答えて

1

したがって、最大の目標数を持つすべてのプレイヤーが必要です。 1つの方法は変数を使用します。もう1つはサブクエリが必要です。以下は、相関副問合せを使用しますが、この記述には、いくつかの方法があります。ただ、元のテーブルにあなたの最初のクエリに参加

SELECT year, goals, GROUP_CONCAT(name ORDER BY name) as names 
FROM table t 
WHERE t.goals = (SELECT MAX(t2.goals) AS goals 
       FROM table t2 
       WHERE t2.year = t.year 
       ) 
GROUP BY year, goals; 
+0

うまく動作します。私は 'join'と' union'を調べましたが、どちらも成功しませんでした。 –

0

を:

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT year, MAX(goals) AS goals 
    FROM yourTable 
    GROUP BY year 
) t2 
    ON t1.year = t2.year AND 
     t1.goals = t2.goals 

をこのアプローチを使用するには、複数のレコードが存在することになります最大数のゴールで1人以上のプレイヤーが縛られている年の間、たとえば、サンプルデータセットに対してこのクエリを実行した場合、プレイヤー1とプレイヤー2の両方が3年目に出現し、各プレイヤーは7ゴールを持ちます。

+0

これはあなたが記述した通りであり、同様の問題を抱えている他の人には役に立つでしょう。 しかし私にとっては、上記のGordon Linoffのソリューションで提供されているように、結びつきが1つの結果として提供されるように、GROUP_CONCATを使用することが非常に重要でした。 ありがとうございます。 –