【问题标题】:Update query that needs to find the 'newest' row更新需要查找“最新”行的查询
【发布时间】:2010-03-01 07:33:11
【问题描述】:

我的注销功能需要更新登录列表的最新行。

这是我想出的,但它甚至没有通过语法验证。

$query =
    'UPDATE user_logins
     SET active = 0
     WHERE user_id = ' . Database::instance()->escape($this->getCurrentUserId()) . '
     AND datetime = MAX(datetime) LIMIT 1';

基本上可能有 30 个左右具有相同的user_id 值。我只想更新上次登录。这显然是最新的datetime 值。

我做错了什么?

【问题讨论】:

  • 如果没有框架,这将需要大约 10 秒。他们一定很有趣。

标签: php sql mysql kohana-3


【解决方案1】:

如果您的日期时间列是 timestampdatetime 类型字段,这应该可以工作。

$query =
    'UPDATE user_logins
     SET active = 0
     WHERE user_id = ' . Database::instance()->escape($this->getCurrentUserId()) . '
     ORDER BY datetime DESC LIMIT 0,1';

【讨论】:

  • 速度+1。当。我会删除我重复的答案,并学会更快地打字:)
【解决方案2】:

您必须为此使用子查询。

$query =
    'UPDATE user_logins
     SET active = 0
     WHERE user_id = ' . Database::instance()->escape($this->getCurrentUserId()) . '
     AND datetime = (SELECT MAX(datetime) FROM user_logins WHERE user_id = '' . Database::instance()->escape($this->getCurrentUserId()) . ') LIMIT 1';

或者类似的东西。

编辑: 正如评论所述,由于缺乏 MySQL 的支持,这将不起作用。我会把这个答案留作参考。

【讨论】:

  • 不幸的是,这不适用于 MySQL。你会得到一个错误Error 1093 (ER_UPDATE_TABLE_USED)(见dev.mysql.com/doc/refman/5.0/en/subquery-errors.html
  • 子查询中还需要添加用户id条件,否则会从非当前用户的任何人那里得到最大日期时间。
  • 嗯,mysql还有很多要补充的。
  • 这种方法对我来说确实有点矫枉过正。为什么不先按日期时间对列进行排序,然后按照我的解决方案建议选择最上面的行?
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 2013-03-23
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多