web-dev-qa-db-ja.com

MySQLの最新のタイムスタンプによる選択

SOで似たようなタイプの質問を見てきましたが、特定の問題の解決策を見つけることができませんでした。 (参考に、これらは私の実際の列ではなく、単なる短縮例です)。

基本的なテーブルがあります:

`my_table`

user_1           user_2                timestamp
======================================================
  23              25              2012-08-10 22:00:00
  24              22              2012-08-10 19:00:00   <=== I would like to return this row
  24              22              2012-08-10 17:00:00
  21              17              2012-08-10 15:00:00

だから、私がしたいことはできることです:

 1) Select the "newest" row, based on timestamp AND 
 2) Select the 'user_2' column when given a value.  

私は次のようなものを試しました:

 SELECT *
 FROM my_table
 WHERE user_2 = 22
 AND timestamp = (
 SELECT MAX( timestamp )
 FROM my_table )
 LIMIT 1 

しかし、これは探している行を返しません。このクエリを修正するのに役立つことは素晴らしいことです。

どうもありがとう。

24
Dodinas
SELECT * FROM my_table -- standard stuff
   WHERE user_2 = 22 -- predicate
   ORDER BY timestamp DESC -- this means highest number (most recent) first
   LIMIT 1; -- just want the first row

編集:

ちなみに、元のクエリが機能しなかった理由が知りたい場合は、各部分を分解してみましょう。

  • my_table...からいくつかのものを選択します.
  • ここで、user_2 = 22
  • およびtimestamp =(いくつかの値、とりあえず脇に置いておきましょう)
  • 制限1

さて、そのtimestamp値に戻ると、それはあなたのサブクエリから来ています:

SELECT MAX( timestamp ) FROM my_table

このサブクエリはuser_2に基づいて行を制限しないことに注意してください。テーブル全体の最大タイムスタンプを求めます。その最大タイムスタンプは、上の表の最初のタイムスタンプです:(user_1 = 23、user_2 = 25、timestamp = 2012-08-10 22:00:00)。

それでは、トップレベルクエリにプラグインしてみましょう。

  • my_table...からいくつかのものを選択します.
  • ここで、user_2 = 22
  • タイムスタンプ= 2012-08-10 22:00:
  • 制限1

...そして、あなたはそのような行がないことがわかります。

59
yshavit

誰かがSQL Serverで同様の問題を抱えている場合、これはあなたのために機能します(前の投稿で提案されたMySQLクエリはSQL Serverでは機能しません):

SELECT * FROM my_table 
WHERE    timestamp =  ( SELECT MAX( timestamp ) FROM my_table 
                        WHERE user_2 = 22 )
5
RicardoMarquez

別の方法は、MAX(timestamp)を計算するときにGROUP BYuser_2列を使用することです。そうすることで、MAX(timestamp)はテーブル全体の最新の日付ではなく、同じuser_2値を持つレコードの最新のタイムスタンプグループごとを計算します。

したがって、たとえば、クエリは次のようになります。

SELECT * FROM my_table
WHERE user_2 = 22
AND timestamp =
  (SELECT MAX(timestamp) FROM my_table
   WHERE user_2 = 22
   GROUP BY user_2)
LIMIT 1;

このクエリは、私が this excellent answer で見つけた答えから適応されています。

4
Kevin

これで全部です。

SELECT timestamp 
       FROM my_table 
       WHERE user_22 = '22' 
       ORDER BY timestamp DESC /*or ASC*/

そして、あなたがそれを照会すると、コードは

while($row = mysql_fetch_array(the sql query)){
$timestamp = $row['timestamp']
}
0
Bryan Bojorque