2010-12-21 19 views
3

を選択し、私はmysqlのテーブルに参加 - 最新の行

STATUS_ID NAME_ID  TIMESTAMP 
1   1   2010-12-20 12:00 
2   2   2010-12-20 10:00 
3   3   2010-12-20 10:30 
4   3   2010-12-20 14:00 

は、私はすべてを選択するには、以下の2つのMySQLテーブル

テーブル名

NAME_ID NAME 
1   name1 
2   name2 
3   name3 

TABLEステータスを希望しています情報テーブルNAMESと最近の共同rrespondent TIMESTAMP

NAME_ID NAME  TIMESTAMP 
1  name1 2010-12-20 12:00 
2  name2 2010-12-20 10:00 
3  name3 2010-12-20 14:00 

RESULT

テーブルSTATUSからアムは、このいずれかに立ち往生。 新しいタイムスタンプにのみ参加を残すにはどうすればよいですか?

答えて

2

は、このクエリを試してみてください。

select n.NAME_ID , n.NAME , max(TIMESTAMP) as time from NAMES n left join 
STATUS s on s.NAME_ID = n.NAME_ID group by n.NAME_ID 
+0

私はあなたの答えが好きです。それは私が探していたものです。ありがとう。 ほんの少しの変化... は 'names'.'ID'、MAX(' status'.'date')を選択datecre' 'AS names'、' status' WHERE '' names'.' FROM ID' = '名前' .'name_ID' GROUP BY '名前' .'ID' – cmancre

0
SELECT 
    status.* 
FROM 
    status 
     JOIN 
      (SELECT name_id, MAX(timestamp)AS latest FROM status GROUP BY name_id) AS sub 
      ON (status.name_id = sub.name_id AND status.timestamp = sub.latest); 
2
SELECT * 
FROM table_names tn 
LEFT JOIN 
     table_status ts 
ON  ts.status_id = 
     (
     SELECT status_id 
     FROM table_status tsi 
     WHERE tsi.name_id = tn.name_id 
     ORDER BY 
       name_id DESC, TIMESTAMP DESC, status_id DESC 
     LIMIT 1 
     ) 

これは正しく重複を処理します。

table_status (name_id, timestamp, status_id)にインデックスを作成すると、これが高速に機能します。

+0

あまりにも複雑ですね。上記の "Haim Evgi"の答えはよりきれいに見えます。どう思いますか? – cmancre

+1

@cmancre: 'timestamp'以外の' table_status'以外の値を必要としないなら、Haimの解答は素晴らしいです。 – Quassnoi