SQL, имеющий столбцы не в SELECT
у меня есть таблица с 3 столбцами:
userid mac_address count
записи для одного пользователя может выглядеть так:
57193 001122334455 42
57193 000C6ED211E6 15
57193 FFFFFFFFFFFF 2
Я хочу создать представление, которое отображает только те MAC, которые считаются "обычно используемыми" для этого пользователя. Например, я хочу отфильтровать MAC, которые используются
SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
FROM mactable
GROUP BY userid
HAVING count*10 >= MAX(count)
и действительно, результат таков:
57193 001122334455,000C6ED211E6 42
однако я действительно не хочу, чтобы столбец count в моем представлении. Но если я выну его из инструкции SELECT, я получу следующую ошибку:
#1054 - Unknown column 'count' in 'having clause'
есть ли способ, которым я могу выполнить эту операцию, не будучи вынужденным иметь неприятный счетчик-столбец в моем представлении? Я знаю, что, вероятно, могу сделать это с помощью внутренних запросов, но я хотел бы избежать этого для производительности причины.
ваша помощь очень ценится!
1 ответов
As HAVING
явно ссылается на имена столбцов в списке выбора, невозможно то, что вы хотите.
Однако, вы можете использовать ваш выбор в качестве подзапроса в Select, который возвращает только те строки, которые вы хотите иметь.
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 или нет...