2017-10-25 9 views
2

私は毎日真夜中にスクリプトによって更新される高いスコアの表を持っています。今日の日付でmax(列)から単一行を見つけるためのmySQL自己結合テーブル

テーブル名:hiscores

+-------+-------+---------------------+ 
| user | score |  time   | 
+-------+-------+---------------------+ 
| Bob | 100 | 2017-10-24 00:00:04 | 
| Frank | 105 | 2017-10-24 00:00:05 | 
| Ahmed | 44 | 2017-10-24 00:00:06 | 
| Frank | 77 | 2017-10-25 00:00:04 | 
| Bob | 101 | 2017-10-25 00:00:05 | 
| Ahmed | 100 | 2017-10-25 00:00:06 | 
+-------+-------+---------------------+ 

私は今日置かれ、最も高いスコアをユーザに戻りたいです。

| Bob | 101 | 2017-10-25 00:00:05 | 

は当初、私はこれを試してみました: - 間違った日付/時刻を

最高得点で単一の行を返さ
SELECT hs.time, hs.user, hs3.high_score 
    FROM `hiscores` AS hs 

    JOIN (SELECT MAX(hs2.score) AS high_score 
      FROM `hiscores` AS hs2 
     ) AS hs3 
    ON hs.score = hs3.high_score 

今日の日付が2017年10月25日で、必要な結果と仮定すると、

| Bob | 101 | 2017-10-25 00:00:04 | 

は、次に私が試した:

正しいユーザーを返し、得点が、(すべての回で)上の3行
SELECT hs5.hs_time, hs.user, hs3.high_score 
    FROM `hiscores` AS hs 

    JOIN (SELECT MAX(hs2.score) AS high_score 
      FROM `hiscores` AS hs2 
     ) AS hs3 
    ON hs.score = hs3.high_score 

    JOIN(SELECT hs4.time AS hs_time FROM `hiscores` AS hs4) AS hs5 
    ON DATE(hs5.hs_time) = DATE(NOW()) 

| Bob | 101 | 2017-10-25 00:00:04 | 
| Bob | 101 | 2017-10-25 00:00:05 | 
| Bob | 101 | 2017-10-25 00:00:06 | 

私は間に多くのことを試みましたが、それらの2つだけではありませんが、それらは私の最も近い試みです。私は問題を見ることができますが、それを修正する方法はありません。

+0

問題を部品に分割します。今日最高得点の行を選ぶためにオリジナルに加えて何が必要でしょうか?その後、名前を取得するには?次に重複を取り除くには? PS今日、複数の人が最大値を持っていたら? – philipxy

答えて

1

この場合、joinを使用する必要はありません。次の例に従ってください:

SELECT 
    user, score, time 
FROM `hiscores` 
WHERE 
    DATE(time)=CURDATE() AND 
    score=(SELECT MAX(score) FROM `hiscores` WHERE DATE(time)=CURDATE()) 
+0

私にとってこれは正しいスコアで3つの結果を返しますが、その日のすべてのユーザーとすべてのスコア:bob - 101 - 今日 - 101、ahmned - 100 - today - 101、Frank - 77 - today - 101 – DJR

+0

今すぐアップデートしてみてください –

+0

これは完璧に動作しました! - 受け入れ – DJR

0

これは関係を考慮していないことに注意してください。

SELECT * 
    FROM my_table 
WHERE time >= CURDATE() 
ORDER 
    BY score DESC 
LIMIT 1