37

SO で同様のタイプの質問を見たことがありますが、特定の問題の解決策を見つけることができませんでした。(参考までに、これらは私の実際のコラムではなく、短縮された例です)。

私は基本的なテーブルを持っています my_table:

ユーザー_1 ユーザー_2 タイムスタンプ 注(表の一部ではありません)
23 25 2012-08-10 22:00:00
24 22 2012-08-10 19:00:00 <=== この行を返したい
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 

しかし、これは私が探している行を返しません。このクエリの修正に関するヘルプは素晴らしいでしょう。

どうもありがとう。

4

4 に答える 4

77
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、タイムスタンプ = 2012-08-10 22:00:00)。

それでは、それをトップレベルのクエリに戻しましょう。

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

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

于 2012-08-11T05:38:19.810 に答える
5

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

SELECT * FROM my_table 
WHERE    timestamp =  ( SELECT MAX( timestamp ) FROM my_table 
                        WHERE user_2 = 22 )
于 2014-04-25T02:33:09.390 に答える
4

別の方法は、計算するGROUP BYときにuser_2列にすることですMAX(timestamp)。そうすること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;

このクエリは、この優れた回答で見つけた回答を基にしています。

于 2015-03-11T22:19:14.160 に答える
0

これは私が得たすべてです。

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']
}
于 2012-08-11T05:45:37.917 に答える