2016-04-01 13 views
0

人と関連付けるテストのタイムスタンプの最大値(つまり最新のもの)を選んで4つのテーブルにまたがって結合する必要があります。それは完璧であるよう複雑なjoinとMySQLのMAX()クエリ

SELECT students.ref, students.fname, students.sname, classes.name AS 'group', tests.id, max(tests.timestamp) FROM tests, students, classlinks, classes WHERE tests.ref=students.ref AND classlinks.ref=students.ref AND classlinks.classid=29 AND tests.grade=2 AND tests.subject=2 GROUP BY students.ref ORDER BY students.sname ASC, students.fname ASC 

クラスの各学生のために、私は彼らの最新のテストが何であるかをルックアップしたいし、そのIDを取得し、タイムスタンプが
になります。クラスの各学生のために、それはタイムスタンプを提供します最も最近のテストの残念ながら、そのタイムスタンプに関連付けられたテストIDは間違っています。ランダムテストのテストIDを与えるだけです。

私は

GROUP BY students.ref, tests.id 

されるように「でグループ」を変更する場合は、クエリは、タイムスタンプを修正するために、正しいテストIDと一致したが、今は各学生のためのいくつかのエントリがあります。誰もが最新のタイムスタンプを修正するために照合された正しいテストIDで、各学生のために1つの行を得ることができるように、アドバイスを持っていますか?どんな助けもありがたい。ありがとう。

表の説明:

mysql> describe students; 
+--------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+--------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| ref | varchar(50) | NO | UNI | NULL |    | 
| fname | varchar(22) | NO |  | NULL |    | 
| sname | varchar(22) | NO |  | NULL |    | 
| school | int(11)  | NO |  | NULL |    | 
| year | int(11)  | NO |  | NULL |    | 
+--------+-------------+------+-----+---------+----------------+ 
6 rows in set (0.00 sec) 
mysql> describe classes; 
+---------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+---------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| subject | int(11)  | YES | MUL | NULL |    | 
| type | int(11)  | YES |  | 1  |    | 
| school | int(11)  | YES |  | NULL |    | 
| year | int(11)  | YES |  | NULL |    | 
| name | varchar(50) | YES |  | NULL |    | 
+---------+-------------+------+-----+---------+----------------+ 
6 rows in set (0.00 sec) 

mysql> describe classlinks; 
+---------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+---------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| ref  | varchar(50) | YES | MUL | NULL |    | 
| subject | int(11)  | YES |  | NULL |    | 
| school | int(11)  | YES |  | NULL |    | 
| classid | int(11)  | YES | MUL | NULL |    | 
| type | int(11)  | YES |  | 1  |    | 
+---------+-------------+------+-----+---------+----------------+ 
6 rows in set (0.00 sec) 
mysql> describe tests; 
+------------+-------------+------+-----+-------------------+-----------------------------+ 
| Field  | Type  | Null | Key | Default   | Extra      | 
+------------+-------------+------+-----+-------------------+-----------------------------+ 
| id   | int(11)  | NO | PRI | NULL    | auto_increment    | 
| subject | int(11)  | YES |  | NULL    |        | 
| ref  | varchar(22) | NO | MUL | NULL    |        | 
| test  | int(3)  | NO |  | NULL    |        | 
| grade  | varchar(22) | NO |  | NULL    |        | 
| timestamp | timestamp | NO | MUL | CURRENT_TIMESTAMP |        | 
| lastupdate | timestamp | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+1

'classlinks.classid = 29 AND classlinks.classid = classes.id'これのポイントは何ですか? 1つのフィールドには1つの値しか指定できないため、これはおそらくclasses.idが29のレコードに対してのみ有効です。 –

+0

ありがとう;サンプルクエリで修正されました。まだ問題は残っています! – tornadof3

+0

テーブルのスキーマ – geeksal

答えて

1

私は(ref,timestamp)の組み合わせがtestsテーブル内で一意であると仮定しています。ここで私の解決策ですが、私はそれを検証するためのサンプルデータはありません。それが私がそれをテストできるようにサンプルデータを投稿するよりも間違っている場合。ここで

が働いている更新クエリをチェックしている

UPDATE sqlfiddle

SELECT students.ref, 
    students.fname, 
    students.sname, 
    classes.name AS 'group', 
    tests.id, 
    T.timestamp 
FROM (select ref,max(timestamp) as timestamp from tests group by ref)as T 
    natural join tests, students, classlinks, classes 
WHERE 
T.ref=students.ref AND 
classlinks.ref=students.ref AND 
classlinks.classid=classes.id AND 
classlinks.classid=29 AND 
tests.grade=2 AND 
tests.subject=2 
ORDER BY students.sname ASC, students.fname ASC 
+0

ありがとうございます。 sqlfiddleの使い方を教えてください。http://sqlfiddle.com/#!9/b0b698/1 シンタックスエラーがありますが、できません。それは何ですか? – tornadof3

+0

@ tornadof3更新された答えを確認する私はそれが最終的に終わったと思う:) – geeksal

+0

ありがとうございます!これは完全に動作します! (私にとっては)非常に複雑なSQLクエリです。 – tornadof3

0

SQLでクエリをロジックを使用するには、MySQLのわからない、次のように書かれてますが、論理作品を願っていますすることができます。

Select ref 
     ,fname 
     ,sname 
     ,ID 
     ,group 
     ,Timestamp 

From 
    (select 
     S.ref 
     ,S.fname 
     ,S.sname, 
     ,T.id 
     ,classes.name AS 'group' 
     ,T.timestamp 
     from 
      tests T,students S, classlinks, classes 
     Where 
      T.ref=S.ref and 
      T.grade=2 AND 
      classlinks.ref=students.ref AND 
      classlinks.classid=29 AND 
      classlinks.classid=classes.id AND 
      T.subject=2) A 

    inner join 

    (SELECT tests.ref   
      ,max(tests.timestamp) 
    FROM 
     tests 
    group by 
     tests.ref 
    ) B 
    on 
     A.ref=b.ref and 
     A.timestamp = b.timestamp 
+0

私の回答が投稿されるまで、テーブルスキーマをチェックしていませんでした。 – Dev