2011-07-14 73 views
5

我有3列的表格:SQL有上列沒有SELECT

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' 

有什麼辦法,我沒有被強迫在我看來,一個討厭的數列可以執行此操作?我知道我可以使用內部查詢來做到這一點,但我想避免出於性能原因這樣做。

非常感謝您的幫助!

回答

7

由於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 

UPDATE:
因爲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) 

這將宣佈視圖,儘管有關的SELECT語句返回比那些兩列只返回列useridmacs
儘管我不確定,非DBMS MySQL是否支持這個或不...

+0

我不知道子查詢可以這樣使用。非常感謝,只是我正在尋找的答案! – Rapsey

+0

但是,我碰到以下內容: #1349 - 視圖的SELECT包含FROM子句中的子查詢 任何想法? – Rapsey

+0

@Rapsey:不,因爲您從未告訴過我們您正在使用的DBMS。 –