我有一个MySQL查询来从表中删除“附近”的重复行,并且在我的项目之外使用测试数据时,查询似乎按预期工作。当我在项目中使用与PHP相同的查询时,我得到一个SQL错误。我一直在尝试各种不同的引号和反引号组合,我似乎无法让这个工作。
知道这里发生了什么吗?
问题正在解决:这个表有时会有几乎相同的行,唯一的例外是as_of_date列和总数。只有最近的日期很重要,一旦有更新的数据,此表中不再需要任何旧数据。
具有示例数据的表结构:
+----+---------+------+-------------+-------+
| id | account | year | as_of_date | total |
+----+---------+------+-------------+-------+
| 1 | 123 | 2017 | 2017-02-02 | 250 |
| 2 | 123 | 2017 | 2017-11-24 | 790 |
| 3 | 123 | 2018 | 2018-01-30 | 55 |
| 4 | 456 | 2016 | 2016-04-04 | 500 |
| 5 | 456 | 2016 | 2016-10-10 | 300 |
| 6 | 456 | 2017 | 2017-03-12 | 44 |
| 7 | 789 | 2015 | 2015-12-23 | 2000 |
+----+---------+------+-------------+-------+
预期结果:期望的结果是删除表中除最近一行(as_of_date)之外的所有“近似重复”行。因此,对于任何给定的帐户和年份,最多只能有一行。执行查询后,表格应如下所示:
+----+---------+------+-------------+-------+
| id | account | year | as_of_date | total |
+----+---------+------+-------------+-------+
| 2 | 123 | 2017 | 2017-11-24 | 790 |
| 3 | 123 | 2018 | 2018-01-30 | 55 |
| 5 | 456 | 2016 | 2016-10-10 | 300 |
| 6 | 456 | 2017 | 2017-03-12 | 44 |
| 7 | 789 | 2015 | 2015-12-23 | 2000 |
+----+---------+------+-------------+-------+
查询:
$query = "DELETE FROM `my_table` AS t
WHERE t.as_of_date NOT IN (
SELECT MAX(as_of_date)
FROM (SELECT * FROM `my_table`) AS t2
WHERE t2.account = t.account AND t2.year = t.year
GROUP BY account, `year`
)";
这是SQL错误:
您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'AS t WHERE t.as_of_date NOT IN(第1行的S')附近使用正确的语法
不要在DELETE FROM
中使用表别名。也就是说,尝试DELETE FROM my_table WHERE...
,省略AS t
。
顺便说一句,你真正需要反引号的唯一情况是当你的表名与保留字相同或者在其中有空格时。
SELECT * FROM `SELECT`
要么
SELECT * FROM `My Favorite Table`
聪明的程序员避免这些情况。