MySQL在SELECT子句中关联子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL在SELECT子句中关联子查询相关的知识,希望对你有一定的参考价值。

我正在尝试在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中运行该查询时,它将一直运行直到数据库连接到期。我看不出这个查询与我引用的网站上的查询有多大的不同。

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

答案

这可能是查询性能的问题。需要为每一行执行此类子查询,因此运行可能需要很长时间。使用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
另一答案

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

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 
另一答案

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

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

以上是关于MySQL在SELECT子句中关联子查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - View 的 SELECT 在 FROM 子句中包含一个子查询

如何在查询语句 Mysql 中格式化日期?

SELECT 数据查询(使用MySQL管理和查询数据)

SELECT 数据查询(使用MySQL管理和查询数据)

#1349 - 视图的 SELECT 在 FROM 子句中包含一个子查询

MySQL中的常见子查询语句