【问题标题】:mysql max strict modemysql max 严格模式
【发布时间】:2014-01-01 04:36:43
【问题描述】:

我有以下疑问:

DELETE FROM table1 
WHERE node_id = ".$id." 
AND date < (
            SELECT
                (MAX(date)- INTERVAL 1 MONTH) 
            from table1  
            WHERE node_id = ".$id."
)

但是由于启用了 mysql 严格模式,我得到了错误:

ERROR 1093 (HY000): You can't specify target table 'table1' for update in FROM clause

在线调查后,我尝试重新创建查询,如下所示:

SELECT 
    * 
FROM table1 as tb1 
INNER JOIN table1 as tb2 
    on tb1.id = tb2.id 
HAVING tb1.date < MAX(tb2.date)-INTERVAL 1 MONTH AND tb1.node_id = 1;

但是结果集返回的是空的。

我已将max(tb2.date) 更改为手动输入的日期,这给了我预期的结果。

有什么想法吗?

【问题讨论】:

  • 尝试使用爱丽丝的名字作为表
  • 谁!"£% 是爱丽丝?

标签: mysql max mysql-error-1093


【解决方案1】:

你能试试这个吗?

使用 JOIN

数据

mysql> select * from test;
+---------+------------+
| node_id | dt         |
+---------+------------+
|       1 | 2011-03-01 |
|       1 | 2011-02-01 |
|       1 | 2011-01-01 |
+---------+------------+
3 rows in set (0.00 sec)

选择

SELECT *
FROM (
  SELECT MAX(dt) AS max_dt
  FROM test
  WHERE node_id = 1
) x INNER JOIN test ON test.node_id = 1 AND test.dt < x.max_dt;
+------------+---------+------------+
| max_dt     | node_id | dt         |
+------------+---------+------------+
| 2011-03-01 |       1 | 2011-01-01 |
| 2011-03-01 |       1 | 2011-02-01 |
+------------+---------+------------+

删除

DELETE test
FROM (
  SELECT MAX(dt) AS max_dt
  FROM test
  WHERE node_id = 1
) x INNER JOIN test ON test.node_id = 1 AND test.dt < x.max_dt;
Query OK, 2 rows affected (0.02 sec)

检查

mysql> select * from test;
+---------+------------+
| node_id | dt         |
+---------+------------+
|       1 | 2011-03-01 |
+---------+------------+
1 row in set (0.00 sec)

使用变量

在您的情况下,您尝试仅删除一个 node_id。这使得查询变得简单。

SELECT @max_dt := MAX(dt)
FROM test  
WHERE node_id = 1;
+--------------------+
| @max_dt := MAX(dt) |
+--------------------+
| 2011-03-01         |
+--------------------+


DELETE FROM test 
WHERE node_id = 1
AND dt < @max_dt;
Query OK, 2 rows affected (0.00 sec)

顺便说一句

您问了 17 个问题,但没有接受任何答案。没有有用的答案吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2014-02-20
    • 2021-12-14
    • 2021-09-28
    相关资源
    最近更新 更多