SELECT子句

时间:2019-04-26 05:19:05

标签: mysql sql select correlated-subquery

我正在尝试在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中运行该查询时,它将一直运行到数据库连接过期为止。我看不到此查询与我所引用的网站有何不同。

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

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

这可能是查询性能的问题。此类子查询需要针对每一行执行,因此可能需要很长时间才能运行。可以使用foreach($_POST['order'] as $page_id => $order) { $order = new Page(); // <--- you prolly want to fetch an existing page here with $page_id $order->setIdSite($id_book); $order->setOrder($order); // this, of course, does not work... dump($order); /*die;*/ } 来简化查询:

group by

有关评论的更新:

  

如果我想为除一种类型以外的其他类型的系统添加更多的列怎么办?

使用查询:

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