SQL имея на столбцах не в SELECT - PullRequest
6 голосов
/ 14 июля 2011

У меня есть таблица с 3 столбцами:

userid   mac_address   count

Записи для одного пользователя могут выглядеть следующим образом:

57193   001122334455   42
57193   000C6ED211E6   15
57193   FFFFFFFFFFFF   2

Я хочу создать представление, отображающее только эти MAC-адресакоторые считаются "обычно используемыми" для этого пользователя.Например, я хочу отфильтровать MAC-адреса, которые используются <10% по сравнению с наиболее используемым MAC-адресом для этого пользователя.Кроме того, я хочу 1 строку на пользователя.Этого легко достичь с помощью GROUP BY, HAVING & GROUP_CONCAT: </p>

SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
FROM mactable
GROUP BY userid
HAVING count*10 >= MAX(count)

И действительно, результат будет следующим:

57193   001122334455,000C6ED211E6   42

Однако я действительно не хочу подсчитыватьКолонка на мой взгляд.Но если я вычеркну его из оператора SELECT, я получу следующую ошибку:

#1054 - Unknown column 'count' in 'having clause'

Можно ли каким-либо образом выполнить эту операцию, если у меня не будет неприятного счетного столбца в моем представлении?Я знаю, что, вероятно, могу сделать это с помощью внутренних запросов, но я бы не хотел этого делать из соображений производительности.

Ваша помощь очень ценится!

1 Ответ

8 голосов
/ 14 июля 2011

Поскольку HAVING явно ссылается на имена столбцов в списке выбора, то, что вы хотите, не возможно.
Однако вы можете использовать ваш выбор как подвыбор для выбора, который возвращает только те строки, которые вы хотитеhave.

SELECT a.userid, a.macs
FROM
(
    SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
    FROM mactable
    GROUP BY userid
    HAVING count*10 >= MAX(count)
) as a

ОБНОВЛЕНИЕ:
Из-за ограничений MySQL это невозможно, хотя это работает в других СУБД, таких как Oracle.Одним из решений будет создание представления для подзапроса.Другое решение кажется более чистым:

CREATE VIEW YOUR_VIEW (userid, macs) AS
SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
FROM mactable
GROUP BY userid
HAVING count*10 >= MAX(count)

Это объявит представление как возвращающее только столбцы userid и macs, хотя базовый оператор SELECT возвращает больше столбцов, чем эти два.
Хотя яя не уверен, поддерживает ли не СУБД MySQL это или нет ...

...