【发布时间】:2010-12-05 03:36:53
【问题描述】:
我有一个这样的表(MySQL 5.0.x,MyISAM):
response{id, title, status, ...} (status: 1 new, 3 multi)
如果至少有 20 个标题相同,我想将所有响应的状态从新 (status=1) 更新为多个 (status=3)。
我有这个,但它不起作用:
UPDATE response SET status = 3 WHERE status = 1 AND title IN (
SELECT title FROM (
SELECT DISTINCT(r.title) FROM response r WHERE EXISTS (
SELECT 1 FROM response spam WHERE spam.title = r.title LIMIT 20, 1)
)
as u)
请注意:
- 我做嵌套选择以避免著名的
You can't specify target table 'response' for update in FROM clause - 出于性能原因,我不能使用
GROUP BY。使用LIMIT的解决方案的查询成本要好得多(但可读性较差)。
编辑:
- 可以在 MySQL 中执行 SELECT FROM UPDATE 目标。 See solution here
- 问题在于所选数据完全错误。
-
我发现唯一可行的解决方案是使用
GROUP BY:UPDATE response SET status = 3 WHERE status = 1 AND title IN (SELECT title FROM (SELECT title FROM response GROUP BY title HAVING COUNT(1) >= 20)
作为派生响应)
感谢您的帮助! :)
【问题讨论】:
-
我不太明白第二点。
GROUP BY将比EXISTS的两个子查询更简单、更快。 -
在这种情况下,有很多记录,
group by的查询成本要高得多。即使有适当的索引。 :( -
如果在 GROUP BY 请求中添加过滤条件 WHERE STATUS = 1,结果应该更快(无需重新检查状态已设置为 3 的结果)。我在下面提出了另一种稍微简单的变体(只有一个 SELECT),但性能应该大致相同。
-
@kriss:在我的具体情况下,结果会不一样。已经标记的记录也必须计算在内。但是它们没有更新,因为它们具有正确的状态。 :)
标签: mysql sql mysql-error-1093