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
しかし、これは探している行を返しません。このクエリを修正するのに役立つことは素晴らしいことです。
どうもありがとう。
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
= 22timestamp
=(いくつかの値、とりあえず脇に置いておきましょう)さて、そのtimestamp
値に戻ると、それはあなたのサブクエリから来ています:
SELECT MAX( timestamp ) FROM my_table
このサブクエリはuser_2
に基づいて行を制限しないことに注意してください。テーブル全体の最大タイムスタンプを求めます。その最大タイムスタンプは、上の表の最初のタイムスタンプです:(user_1 = 23、user_2 = 25、timestamp = 2012-08-10 22:00:00)。
それでは、トップレベルクエリにプラグインしてみましょう。
my_table
...からいくつかのものを選択します....そして、あなたはそのような行がないことがわかります。
誰かがSQL Serverで同様の問題を抱えている場合、これはあなたのために機能します(前の投稿で提案されたMySQLクエリはSQL Serverでは機能しません):
SELECT * FROM my_table
WHERE timestamp = ( SELECT MAX( timestamp ) FROM my_table
WHERE user_2 = 22 )
別の方法は、MAX(timestamp)
を計算するときにGROUP BY
user_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 で見つけた答えから適応されています。
これで全部です。
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']
}