Как использовать столбец с псевдонимом в предложении MySQL WHERE?
Вопрос
У меня есть такой запрос MySQL:
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
Я хочу ограничить результаты строками, где вхождения>0.Мне это кажется очень простым, но я не могу заставить его работать.Независимо от того, что я пытаюсь, WHERE или HAVINGs, всякий раз, когда я пытаюсь добавить это ограничение, я не получаю взамен НИКАКИХ СТРОК.Я уверен, что в моей таблице есть данные, которые следует вернуть.Кто-нибудь знает, как добиться того, что я делаю?
Я пробовал это, но это все еще не работает.Есть идеи, почему это все еще не работает?
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
Решение
Я не так хорошо знаком с MySQL, как с SQL Server, но в T-SQL вы не можете использовать псевдонимы в предложениях GROUP BY (первоначально я также думал, что предложения ORDER BY, но с тех пор выяснилось, что это неверно) .В этом случае вы хотите фильтровать на основе результатов GROUP BY, поэтому я бы использовал предложение HAVING следующим образом:
SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
some_table AS q
WHERE
criterion = 'value'
GROUP BY
q.P_id
HAVING
SUM(... some SQL removed for brevity ...) > 0
ORDER BY
Occurrences DESC
LIMIT 10;
Другие советы
Этот запрос работает для меня...
select order_id, sum(qty_ordered) as total_qty
from sales_flat_order_item
group by order_id
having total_qty > 10
order by total_qty desc
О, я нашел для этого место.
Заявление теперь такое:
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;
Кажется, с ORDER BY Occurrences работает нормально,
Я считаю, что агрегаты должны быть в HAVING
пункт.Хотя, признаться, я не уверен, принимаются ли псевдонимы.
HAVING (Occurrences > 0)
HAVING (SUM(...some SQL removed for brevety) > 0)
Альтернативно вы можете использовать подзапрос:
SELECT *
FROM (
-- your current query
) AS sub
WHERE (Occurences > 0)
Согласно стандарту SQL, псевдонимы столбцов недоступны в теле запроса, что доставляет немало неудобств.Учитывая то, что вы пробовали, похоже, что то же самое относится и к MySQL (и некоторым другим СУБД).Вероятно, вам придется повторить выражение в предложении ORDER BY.
Кроме того, в предложении GROUP BY должен быть указан каждый столбец, указанный в *, а не только первичный ключ (хотя, по логике вещей, указания первичного ключа должно быть достаточно).