MySQL коррелированный подзапрос в предложении SELECT - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь выполнить коррелированный подзапрос в предложении SELECT запроса MySQL. Как использовать значение строки в другом столбце внутри предложения WHERE моего подзапроса?

Я ссылаюсь на раздел «Пример коррелированного подзапроса» этой веб-страницы , но по какой-то причине мой запрос не работает так же.

Вот мой код:

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 ]

2 голосов
/ 26 апреля 2019

Использовать оператор 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 голосов
/ 26 апреля 2019

Это может быть проблема выполнения запроса.Такой подзапрос должен выполняться для каждой строки, поэтому выполнение может занять много времени.Запрос можно упростить, используя 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 голосов
/ 26 апреля 2019

Возможно, у вас проблема с областью действия, попробуйте использовать внутреннее соединение вместо подзапроса для каждой строки

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 
...