MySQL - 更新具有最高开始日期的行

时间:2015-03-01 02:14:41

标签: mysql

我正在尝试使用以下命令更新具有最高开始日期的成员行:

UPDATE at_section_details a 
   SET a.sd_end_date = ?
     , a.sd_details = ?
 WHERE a.cd_id = ? 
   AND a.sd_start_date = (SELECT MAX(b.sd_start_date) 
                            FROM at_section_details b 
                           WHERE b.cd_id = ?)

错误消息是: " updateYMGroup中的SQLException:java.sql.SQLException:您不能指定目标表' a'用于FROM子句中的更新

表结构是: sd_id - 主键

cd_id - 外键(多次出现)

sd_section

sd_pack

sd_start_date

sd_end_date

sd_details

成员(cd_id)可以启动然后转出。 然后该成员可以再次转入(新的开始日期)。当他们转出时,我们想要拿出最大开始日期来转出。

非常感谢任何协助。

此致

格林

4 个答案:

答案 0 :(得分:2)

您应该能够将LIMIT语句与ORDER BY一起使用。这些方面的东西:

UPDATE at_section_details a
SET a.sd_end_date=?, a.sd_details=?
WHERE a.cd_id=? 
ORDER BY a.sd_start_date DESC
LIMIT 1

答案 1 :(得分:1)

如同帖子MySQL Error 1093 - Can't specify target table for update in FROM clause

所述

在My SQL中,您无法使用在子查询中更新的同一个表进行更新。

我会尝试将您的子查询更改为此类

(Select x.* from (select max...) as x)

很抱歉缩写代码,我在手机上。

答案 2 :(得分:1)

此查询应该有效:

UPDATE at_section_details
JOIN (
  SELECT cd_id, MAX(sd_start_date) sd_start_date 
  FROM at_section_details 
  WHERE cd_id = ?
  GROUP BY cd_id
) AS t2 USING (cd_id, sd_start_date)
SET sd_end_date=?, sd_details=?;

See this SQL Fiddle for an example

答案 3 :(得分:0)

你可以尝试这个伴侣:

UPDATE at_section_details SET sd_end_date = <input>, sd_details = <input>
WHERE cd_id IN ( 
    SELECT cd_id FROM at_section_details
    WHERE cd_id = <input>
    ORDER BY sd_start_date DESC
    LIMIT 1
);