MySQL如何单查询关联两张表(查询全字段+COUNT统计)
报错原因
你遇到的#1241 - Operand should contain 1 column(s)错误,根因是SELECT子句中的标量子查询仅允许返回单列单行结果,你写的第一个子查询用了SELECT *返回posts表的3个字段,不符合标量子查询的语法要求。另外你原有SQL硬编码了id='bac'的过滤条件,无法一次性返回posts表全量数据对应的评分计数。
正确实现SQL
方案1:左连接直接分组(通用写法)
适合大多数场景,写法简洁:
SELECT p.*, COUNT(r.post_id) AS hits FROM posts p LEFT JOIN rating_info r ON p.id = r.post_id GROUP BY p.id;
逻辑说明:
- 用
LEFT JOIN关联两表,确保posts表中没有对应评分记录的内容也不会被过滤,这类记录的hits值会返回0 - 按posts表主键id分组,直接聚合统计每个post关联的评分记录条数
- 注意
desc是MySQL保留关键字,如果你的环境语法校验严格,需要把p.*替换为明确的字段列表,给desc字段加反引号包裹:p.id, p.Author, p.desc``
方案2:预聚合后关联(大数据量优化写法)
当rating_info表数据量较大时,先聚合评分表再关联性能更好,同时完全兼容ONLY_FULL_GROUP_BY sql_mode:
SELECT p.*, IFNULL(r.hit_count, 0) AS hits FROM posts p LEFT JOIN ( SELECT post_id, COUNT(*) AS hit_count FROM rating_info GROUP BY post_id ) r ON p.id = r.post_id;
原有写法的修正(仅支持单条post查询)
如果坚持用你原来的嵌套子查询思路,不能在子查询里用SELECT *,需要逐字段返回,且只能查询单个post的数据,不适合全表查询场景:
SELECT (SELECT id FROM posts WHERE id = 'bac') AS id, (SELECT Author FROM posts WHERE id = 'bac') AS Author, (SELECT `desc` FROM posts WHERE id = 'bac') AS `desc`, (SELECT COUNT(post_id) FROM rating_info WHERE post_id = 'bac') AS hits;
内容的提问来源于stack exchange,提问作者user655355
相关产品推荐
相关产品推荐

