我有一个包含 3 列的表格:
userid mac_address count
一个用户的条目可能如下所示:
57193 001122334455 42
57193 000C6ED211E6 15
57193 FFFFFFFFFFFF 2
我想创建一个仅显示该用户“常用”的 MAC 的 View 。例如,我想过滤掉与该用户最常用的 MAC 地址相比使用率 <10% 的 MAC。此外,我想要每个用户 1 行。这可以通过 GROUP BY、HAVING 和 GROUP_CONCAT 轻松实现:
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'
有什么方法可以执行此操作,而不会被迫在我看来有一个令人讨厌的计数列?我知道我可能可以使用内部查询来做到这一点,但出于性能原因我想避免这样做。
非常感谢您的帮助!
最佳答案
由于 HAVING
明确引用选择列表中的列名称,因此不可能是您想要的。
但是,您可以将您的选择用作仅返回您想要的行的选择的子选择。
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 等其他 DBMS 中工作。
一种解决方案是为子查询创建一个 View 。另一个解决方案看起来更干净:
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)
这会将 View 声明为仅返回 userid
和 macs
列,尽管底层的 SELECT
语句返回的列多于这两列。< br/>
虽然我不确定,非DBMS MySQL是否支持这个...
关于SQL 具有不在 SELECT 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6692613/