Как использовать псевдоним столбца в предложении MySQL WHERE? - PullRequest
0 голосов
/ 27 января 2009

У меня есть запрос 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. Это кажется мне очень простым, но я не могу заставить его работать. Независимо от того, что я пытаюсь сделать, ГДЕ или ХЕЙВИНГ, всякий раз, когда я пытаюсь добавить это ограничение, я не получаю НИКАКИХ РЯДОВ взамен. Я уверен, что в моей таблице есть данные, которые должны быть возвращены. Кто-нибудь знает, как выполнить то, что я делаю?


Я пробовал это, но это все еще не работает. Какие-нибудь идеи, почему это все еще не будет работать?

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;

Ответы [ 5 ]

5 голосов
/ 27 января 2009

Я не так хорошо знаком с 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;
2 голосов
/ 11 января 2013

Этот запрос у меня работает ...

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
1 голос
/ 27 января 2009

Ах, я нашел место для этого.

Заявление теперь:

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 Occurptions,

0 голосов
/ 27 января 2009

Я полагаю, что агрегаты должны быть в предложении HAVING. Хотя, по общему признанию, я не уверен, принимаются ли псевдонимы.

HAVING (Occurrences > 0)

HAVING (SUM(...some SQL removed for brevety) > 0)

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

SELECT *
FROM (
   -- your current query
) AS sub
WHERE (Occurences > 0)
0 голосов
/ 27 января 2009

В соответствии со стандартом SQL псевдонимы столбцов недоступны в теле запроса, что создает неудобства. Учитывая то, что вы пробовали, звучит так, как будто то же самое верно для MySQL (и некоторых других СУБД). Возможно, вам придется повторить выражение в предложении ORDER BY.

Кроме того, в предложении GROUP BY должен быть указан каждый столбец, который находится в *, а не только первичный ключ (хотя логически достаточно указать первичный ключ).

...