SQL 具有不在 SELECT 中的列

标签 sql group-by having

我有一个包含 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 声明为仅返回 useridmacs 列,尽管底层的 SELECT 语句返回的列多于这两列。< br/> 虽然我不确定,非DBMS MySQL是否支持这个...

关于SQL 具有不在 SELECT 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6692613/

相关文章:

sql-server-2008 - 将一个范围分组到一个范围

sql - 如何获取SQL Server表中具有最大值的所有记录

mysql - 我想要一个从我的数据库中删除重复条目的查询

mysql - SQL在子查询中检索过滤值

python - 如何获取最大值不重复的行的索引?

sql - SQL Server 2008 中表格结果的分组和计数选择

MySQL:SELECT IF() 语句中的 SELECT

完全外连接中 select inside select 的 MySQL 别名

MYSQL外键问题

mysql - 将一个表的项目搜索到另一个表中保存结果