You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:03:29