【问题标题】:MySQL correlated sub-query in SELECT clauseSELECT 子句中的 MySQL 相关子查询
【发布时间】:2025-12-18 11:25:01
【问题描述】:

我正在尝试在 MySQL 查询的 SELECT 子句中执行相关子查询。如何在我的子查询的WHERE 子句中使用另一列中的行的值?

我一直在参考 this webpage 的“相关子查询示例”部分,但由于某种原因,我的查询无法正常工作。

这是我的代码:

SELECT Year,
     ( SELECT COUNT(*)
       FROM systems
       WHERE SYSTEMTYPE = 'handheld' AND Year = sys.Year
     ) as handheld,
     ( SELECT COUNT(*)
       FROM systems
       WHERE SYSTEMTYPE = 'console' AND Year = sys.Year
     ) as console,
FROM systems as sys
WHERE Year IS NOT NULL

基本上,我正在尝试创建一个表格,显示每年创建的每种类型的系统数量。当我在 MySQL Workbench 中运行该查询时,它会一直运行到数据库连接到期。我看不出这个查询与我引用的网站上的查询有何不同。

任何帮助将不胜感激!如果似乎有更好的方法可以解决这个问题,我也对这些想法持开放态度。谢谢!

【问题讨论】:

  • systems 表的索引是否正确?
  • 您的系统表中有多少行?
  • @zedfoxus 大约 5300 行。
  • 我很惊讶查询需要这么长时间!
  • 你可以看看this的帖子

标签: mysql sql select correlated-subquery


【解决方案1】:

这可能是查询性能问题。这样的子查询需要对每一行执行,因此可能需要很长时间才能运行。使用group by可以简化查询:

select year, count(*) from systems
where Year is not null and systemtype = 'handled'
group by Year

关于评论的更新:

如果我想为不同类型的系统添加更多列,而不仅仅是一种类型,该怎么办?

使用查询:

select year,
       sum(case when systemtype = 'handled' then 1 else 0 end) handled,
       sum(case when systemtype = 'console' then 1 else 0 end) console
from systems
where Year is not null
group by Year

【讨论】:

  • 感谢您的回复!很抱歉,这不是更清楚,但是如果我想为不同类型的系统添加更多列,而不仅仅是一种类型怎么办?那有意义吗?有没有更好的方法可以做到这一点?
  • 完美!这正是我所需要的。刚刚试了一下,效果很好。非常感谢!
【解决方案2】:

您可能有范围问题,请尝试对每一行使用内部联接而不是子查询

SELECT sys.Year, t.my_count
FROM systems as sys
INNER JOIN 
  ( SELECT Year, COUNT(*) my_count
    FROM systems
    WHERE SYSTEMTYPE = 'handheld' AND Year = sys.Year
    GROUP BY year
) t on t.year = sys.year
WHERE sys.Year IS NOT NULL 

【讨论】:

    【解决方案3】:

    使用 Group By 语句而不是子查询。随着添加更多行,子查询将使您的查询运行得更慢。试试这个查询来获取每种类型和每年制造的系统数量:

    SELECT
        Year, 
        SYSTEMTYPE, 
        COUNT(*) as Total_systems_per_type_per_year
    FROM systems
    WHERE Year IS NOT NULL
    GROUP BY Year, SYSTEMTYPE
    

    【讨论】:

    • 感谢您的回复!很抱歉这不是更清楚,但是如果我想为每年不同类型的不同计数添加更多列怎么办?例如,如果我添加了 console 类型,并且我希望该计数也位于单独的列中。有什么办法可以做到吗?
    • 您可能需要通过执行以下操作手动添加列:SELECT Year, SUM(IF(SYSTEMTYPE='console',1,0)) as Total_console_per_year, SUM(IF(SYSTEMTYPE='handheld',1,0)) as Total_handheld_per_year FROM systems WHERE Year IS NOT NULL GROUP BY Year
    最近更新 更多