mysql - MySQLの最新の日付のレコードの選択

mysql sql select join

私は2つのテーブルを持っています:COURSESとPERMISSIONS。特定のアカウントで、特定の学生のすべての既存のコースの最新の権限値を示すSELECTを実行しようとしています。

今、私はこれをします:

SELECT COURSES.NAME, PERMISSIONS.VALUE, PERMISSIONS.TS
FROM COURSES LEFT JOIN PERMISSIONS
ON PERMISSIONS.C_ID = COURSES.C_ID AND PERMISSIONS.S_ID = '12345'
WHERE COURSES.A_ID = 'ABCDE'


私が得る結果は

NAME          |  VALUE  |   TS
-----------------------------------------------
Mathematics   | 1       | 2012-01-19 19:13:21
Mathematics   | 0       | 2012-01-19 19:13:15
Mathematics   | 0       | 2012-01-19 19:20:19
Mathematics   | 0       | 2012-01-19 19:20:27
Mathematics   | 0       | 2012-01-19 19:21:29
Biology       |         | 


私が必要なのは、最新のタイムスタンプ(TS)のレコードのみを表示することです。

NAME          |  VALUE  |   TS
-----------------------------------------------
Mathematics   | 0       | 2012-01-19 19:21:29
Biology       |         | 


タイムスタンプのGROUP BYと組み合わせてコース名のORDER BYを試しましたが、正しいレコードが取得されませんでした。

誰か助けてくれますか?
答え
SELECT COURSES.NAME, PL.VALUE, PL.TS
FROM COURSES
LEFT JOIN 
  ( SELECT 
       PERMISSIONS.C_ID, PERMISSIONS.VALUE, PERMISSIONS.TS
    FROM PERMISSIONS
    JOIN
      ( SELECT P.C_ID, MAX(P.TS) AS LATEST
        FROM PERMISSIONS P
        WHERE P.S_ID = '12345'
        GROUP BY P.C_ID ) PG
    ON PERMISSIONS.TS = PG.LATEST ) PL
  ON PL.C_ID = COURSES.C_ID
WHERE COURSES.A_ID = 'ABCDE'


データのサイズに応じて、PERMISSIONSテーブルの(C_ID、TS)にインデックスを追加して、最新の日付の検索を高速化することを検討します。

ALTER TABLE `PERMISSIONS` ADD INDEX (`C_ID`,`TS`);
関連記事

mysql - MySQLに格納された集約関数を作成する方法は?

mysql - INキーワードなしでこのクエリを書き換える方法は?

php - テーブル[テーブル名]はロックされていません

php - codeigniterでのセッションの問題

c# - C#MySqlConnector 6.4.4 LAST_INSERT_ID()As INT64?

php - PHP / HTMLフォームでのユーザーの入力に基づいて、MySQL Select句に特定の列要素を含める方法は?

python - Pythonを使用したファイルのダウンロードとmysqlデータベースへの同時挿入

mysql - 2つの列に一意のインデックスを持つテーブルにINSERT INTO

mysql - MySQLはtable1への挿入時にtable2に行を自動挿入します

php - Zend_Db_Statement_Pdo-> paramsの式で実行