Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在不在SELECT中的列上具有_Sql_Group By_Having - Fatal编程技术网

SQL在不在SELECT中的列上具有

SQL在不在SELECT中的列上具有,sql,group-by,having,Sql,Group By,Having,我有一个包含3列的表: userid mac_address count 一个用户的条目可能如下所示: 57193 001122334455 42 57193 000C6ED211E6 15 57193 FFFFFFFFFFFF 2 我想创建一个视图,只显示那些被认为是该用户常用的MAC。例如,我想过滤掉使用的MAC,因为它显式地引用了选择列表中的列名,这不可能是您想要的。 但是,可以将select用作仅返回所需行的select的子select SELECT

我有一个包含3列的表:

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

57193   001122334455   42
57193   000C6ED211E6   15
57193   FFFFFFFFFFFF   2
我想创建一个视图,只显示那些被认为是该用户常用的MAC。例如,我想过滤掉使用的MAC,因为它显式地引用了选择列表中的列名,这不可能是您想要的。 但是,可以将select用作仅返回所需行的select的子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的限制,这是不可能的,尽管它可以在其他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)
这将声明视图仅返回userid和macs列,尽管底层SELECT语句返回的列比这两个列多。
虽然我不确定非DBMS MySQL是否支持此功能…

我不知道Subselect可以这样使用。非常感谢,这正是我想要的答案!然而,我遇到了以下情况:1349-View的SELECT在FROM子句中包含一个子查询。有什么想法吗?@Rapsey:没有,因为你从来没有告诉我们你在使用什么DBMS。我很抱歉。我正在使用MySQL 5.1.41命名子选择在MySQL中没有帮助。尝试更新后,我得到以下信息:1353-视图的选择和视图的字段列表具有不同的列计数创建第二个视图以从第一个视图中选择确实有效。
#1054 - Unknown column 'count' in 'having clause'
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
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)