2011-07-14 30 views
5

Tôi có một bảng với 3 cột:SQL Có trên các cột không trong CHỌN

userid mac_address count 

Các mục cho một người sử dụng có thể nhìn như thế này:

57193 001122334455 42 
57193 000C6ED211E6 15 
57193 FFFFFFFFFFFF 2 

Tôi muốn tạo ra một cái nhìn mà hiển thị chỉ những MAC được coi là "thường được sử dụng" cho người dùng này. Ví dụ, tôi muốn lọc ra của MAC được sử dụng < 10% so với địa chỉ MAC được sử dụng nhiều nhất cho người dùng đó. Hơn nữa, tôi muốn 1 hàng cho mỗi người dùng. Điều này có thể dễ dàng đạt được với một 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) 

Và quả thực, kết quả như sau:

57193 001122334455,000C6ED211E6 42 

Tuy nhiên tôi thực sự không muốn đếm cột trong tôi lượt xem. Nhưng nếu tôi mang nó ra khỏi câu lệnh SELECT, tôi nhận được lỗi sau:

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

Có cách nào tôi có thể thực hiện thao tác này mà không bị buộc phải có một số cột khó chịu trong quan điểm của tôi? Tôi biết tôi có thể làm điều đó bằng cách sử dụng truy vấn bên trong, nhưng tôi muốn tránh làm điều đó vì lý do hiệu suất.

Trợ giúp của bạn được đánh giá rất nhiều!

Trả lời

7

HAVING chỉ rõ tên cột trong danh sách lựa chọn, bạn không thể thực hiện được những gì bạn muốn.
Tuy nhiên, bạn có thể sử dụng lựa chọn của mình làm một lựa chọn phụ cho một lựa chọn chỉ trả về các hàng bạn muốn có.

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:
Do giới hạn của MySQL này là không thể, mặc dù nó hoạt động trong DBMS khác như Oracle. Một giải pháp là tạo chế độ xem cho truy vấn phụ. Một giải pháp khác có vẻ sạch hơn:

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) 

này sẽ tuyên bố quan điểm như chỉ trả lại cột useridmacs mặc dù tuyên bố cơ bản SELECT trả về cột hơn hai.
Mặc dù tôi không chắc chắn, liệu MySQL không phải DBMS có hỗ trợ điều này hay không ...

+0

Tôi không biết các vùng chọn có thể được sử dụng như thế. Cảm ơn rất nhiều, chỉ là câu trả lời tôi đang tìm kiếm! – Rapsey

+0

Tuy nhiên, tôi chạy vào các mục sau: # 1349 - CHỌN của Chế độ xem chứa truy vấn con trong mệnh đề FROM Bất kỳ ý tưởng nào? – Rapsey

+0

@Rapsey: Không, bởi vì bạn chưa bao giờ nói với chúng tôi, DBMS bạn đang sử dụng. –

Các vấn đề liên quan