Rap*_*sey 8 sql group-by having
我有一个有3列的表:
userid mac_address count
Run Code Online (Sandbox Code Playgroud)
一个用户的条目可能如下所示:
57193 001122334455 42
57193 000C6ED211E6 15
57193 FFFFFFFFFFFF 2
Run Code Online (Sandbox Code Playgroud)
我想创建一个视图,只显示那些被认为对这个用户"常用"的MAC.例如,我想过滤掉与该用户最常用的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)
Run Code Online (Sandbox Code Playgroud)
事实上,结果如下:
57193 001122334455,000C6ED211E6 42
Run Code Online (Sandbox Code Playgroud)
但是我真的不想在我的视图中使用count-column.但是如果我把它从SELECT语句中删除,我会收到以下错误:
#1054 - Unknown column 'count' in 'having clause'
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以执行此操作,而不会被迫在我的视图中有一个令人讨厌的计数列?我知道我可以使用内部查询来做到这一点,但我想避免出于性能原因这样做.
非常感激您的帮忙!
由于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
Run Code Online (Sandbox Code Playgroud)
更新:
由于MySQL的限制,这是不可能的,尽管它可以在其他DBMS(如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)
Run Code Online (Sandbox Code Playgroud)
这将声明视图仅返回列userid
,macs
尽管底层SELECT
语句返回的列数多于这两列.
虽然我不确定,非DBMS MySQL是否支持这个...