10

I need to do something that seems to be very simple:

$bdd->query('UPDATE mytable SET aaa = \''.$aaa.'\', bbb = \''.$bbb.'\' WHERE name = \''.$name.'\'');

My problem: I have multiple records that match this "WHERE", and I want to update only the most recent one (I have a date and an id that can be used to define which record is the most recent)

How can I change my WHERE to add something like "AND id = the_highest_id_of_this_query"?

4

2 に答える 2

27

最新のレコードのみにlimitできますupdate

UPDATE your_table
SET some_column = 1
order by date_time_column desc
limit 1

ここdate_time_columnで、レコードの順序を示す任意の列を指定できます。自動インクリメントIDの場合もあります。

于 2013-01-24T16:17:31.577 に答える
3
UPDATE table
SET column = value
WHERE primary_key =
(
SELECT primary_key
FROM table 
WHERE date_time_column = (select max(date_time_column) FROM table WHERE other_conditions)
)
AND other_conditions

このクエリは order by または limit 句を使用しないため、移植可能です。other_conditions は、内側のクエリと外側のクエリで同じでなければならないことに注意してください。

(これはコメントに投稿されたので) 内部クエリが外部クエリと同じ条件を持つ必要があるのはなぜですか?

  • 内側の条件が外側の結果セットよりも広い結果セットをフェッチする場合、外側の条件を満たす行に含まれる日付よりも前の date_time_column になる可能性があります。ANDそれらを ing すると、0 行がフェッチされます。

  • 内側の条件が外側の結果セットよりも狭い結果セットをフェッチする場合、外側の条件の一部としてまだ満たされている内側のセットの一部ではなく、より新しいレコードを見逃してしまう可能性があります。

これが明確になることを願っています。

于 2013-01-24T16:26:42.203 に答える