MariaDB中如何编写同表查询并更新is_popular字段的正确SQL语句?
解决MariaDB更新多行时的子查询错误
原语句报错是因为使用了=运算符,它只能匹配单个值,但子查询返回了10条id记录,导致ERROR 1242。可以通过以下两种方式修正:
方法一:使用IN替代=
将WHERE id=改为WHERE id IN,让条件匹配子查询返回的多个id值:
UPDATE Pics SET is_popular = true WHERE id IN ( SELECT p.id FROM Pics p WHERE p.approved = true ORDER BY p.points DESC LIMIT 10 );
方法二:使用JOIN方式更新(更高效)
对于大数据量的表,JOIN方式的更新性能更优,写法如下:
UPDATE Pics JOIN ( SELECT id FROM Pics WHERE approved = true ORDER BY points DESC LIMIT 10 ) AS top_pics ON Pics.id = top_pics.id SET is_popular = true;
补充说明
- 两种方法都能实现需求:将已审核(
approved=true)且points降序前10的记录的is_popular设为true。 - JOIN方式避免了子查询的嵌套,在数据量大时执行效率更高。
内容的提问来源于stack exchange,提问作者Ommadawn
相关产品推荐
相关产品推荐

