将c.id =改为c.id IN后MySQL报错,求原因(IN与=子查询疑问)
报错原因及解决办法
把c.id =改成c.id IN后MySQL报错,是因为MySQL语法规则限制:不允许在IN的直接子查询里使用LIMIT子句。而=运算符没有这个限制——毕竟=本来就只接受单个值,MySQL对这类子查询的语法要求更宽松。
原SQL里的子查询虽然加了limit 1确保只返回一行,但IN不支持直接跟带LIMIT的子查询。要解决这个问题,得把带LIMIT的子查询包装成一个派生表(给它加别名,再套一层查询),修改后的代码如下:
Select distinct c.Name As Name from Candidate c where c.id IN ( SELECT t.CandidateId FROM ( Select CandidateId from Vote Group by CandidateId order by count(CandidateId) desc limit 1 ) AS t )
另外提一句:这个场景用=其实更合适,因为子查询通过limit 1只会返回唯一的CandidateId,用=语义更精准,还不会触发这个语法问题。
内容的提问来源于stack exchange,提问作者Nooby
相关产品推荐
相关产品推荐

