11

我有一个包含 3 列的表:

userid   mac_address   count

一个用户的条目可能如下所示:

57193   001122334455   42
57193   000C6ED211E6   15
57193   FFFFFFFFFFFF   2

我想创建一个视图,只显示那些被认为是该用户“常用”的 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)

事实上,结果如下:

57193   001122334455,000C6ED211E6   42

但是,我真的不希望在我看来计数列。但是,如果我将其从 SELECT 语句中取出,则会出现以下错误:

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

有什么方法可以执行此操作而不会被迫在我看来有一个讨厌的计数列?我知道我可能可以使用内部查询来做到这一点,但出于性能原因,我想避免这样做。

非常感激您的帮忙!

4

1 回答 1

11

由于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。一种解决方案是为子查询创建一个视图。另一个解决方案似乎更干净:

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)

这会将视图声明为仅返回列useridmacs尽管基础SELECT语句返回的列比这两个多。
虽然我不确定,非 DBMS MySQL 是否支持这个......

于 2011-07-14T11:50:54.537 回答