Как использовать столбец с псевдонимом в предложении MySQL WHERE?

StackOverflow https://stackoverflow.com/questions/482008

  •  20-08-2019
  •  | 
  •  

Вопрос

У меня есть такой запрос 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 должен быть указан каждый столбец, указанный в *, а не только первичный ключ (хотя, по логике вещей, указания первичного ключа должно быть достаточно).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top