10

我需要做一些看起来很简单的事情:

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

我的问题:我有多个与此“WHERE”匹配的记录,我只想更新最近的一个(我有一个日期和一个 ID,可用于定义哪个记录是最新的)

如何更改我的 WHERE 以添加类似“ AND id = the_highest_id_of_this_query ”的内容?

4

2 回答 2

27

你只能limitupdate最近的记录

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然后,它们将导致获取 0 行。

  • 如果内部条件获取的结果集比外部条件更窄,您最终可能会错过任何较新的记录,而不是内部集的一部分但作为外部条件的一部分得到满足。

希望这可以澄清。

于 2013-01-24T16:26:42.203 回答