MySQL: используйте псевдонимы в агрегатных функциях - PullRequest
4 голосов
/ 17 декабря 2008

У меня есть оператор SQL, похожий на этот:

SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar

Но MySQL не позволяет этого, потому что foo является псевдонимом. Кто-нибудь имеет представление о том, как это можно сделать в SQL?

Ответы [ 4 ]

5 голосов
/ 17 декабря 2008

Нет, вы не можете использовать псевдоним в списке выбора или предложении WHERE. Вы можете использовать псевдоним только в GROUP BY, HAVING или ORDER BY.

Вы также можете использовать псевдонимы, определенные в подзапросе:

SELECT foo, SUM(foo) AS foo_sum
FROM (
  SELECT COUNT(*) AS foo
  FROM bar
);
1 голос
/ 17 декабря 2008
SELECT SUM(foo) as foo_sum
FROM 
(
    SELECT COUNT(*) AS foo
    FROM bar
    GROUP BY baz
)
0 голосов
/ 24 ноября 2017

Я не знаю, что вы пытаетесь сделать, но с вышеуказанными решениями вы запускаете подзапрос в таблице псевдонимов, который неэффективен.

SELECT foo 
FROM (SELECT COUNT(*) AS foo FROM employees) AS T;

В основном T - это ваша таблица псевдонимов, и она возвращает столбец foo со счетчиком, который является отдельной записью, и нет смысла использовать для него функцию SUM (foo), поскольку это одиночная запись.

В любом случае, простой ответ:

SELECT Count(1) AS foo from employees;

Поскольку функция COUNT будет возвращать одни и те же результаты независимо от того, какие поля или поля NOT NULL вы включили в качестве параметров функции COUNT (т. Е. В скобках), вы можете использовать COUNT (1) для повышения производительности. Теперь ядру базы данных не нужно будет извлекать какие-либо поля данных, вместо этого он просто получит целочисленное значение 1.

0 голосов
/ 16 августа 2010

Я думаю, что это не очень хорошая идея. Если вы хотите сделать большой запрос, лучше сделать это без подзапроса. Используйте COUNT(*) и более крупные функции без псевдонима, если вам это нужно.

Я сделал запрос с псевдонимами и подзапросами. Это заняло около часа! Затем я воспроизвел запрос без псевдонима. Это заняло около 45 минут. Забудьте о подзапросах в этой ситуации. Это менее сложно и более красиво, но делает ваш запрос медленнее.

...