我有一个MySQL查询要删除' near'从表中重复行,并在我的项目之外使用测试数据时,查询似乎按预期工作。当我在项目中使用与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 在哪里t.as_of_date NOT IN( S'在第1行
答案 0 :(得分:0)
请勿在{{1}}中使用表别名。也就是说,尝试ViewModel First Navigation
,省略DELETE FROM
。
顺便说一句,你真正需要反引号的唯一时候就是当你的表名与保留字相同或者在其中有空格时。
DELETE FROM my_table WHERE...
或
AS t
聪明的程序员避免这些情况。