2010-07-02 84 views
2

我有一個包含以下幾列的用戶表:SQL分組依據 - 選擇兩列

| User_ID (int) | Name (varchar) | Age (int) | Experience_Level (int) | 

我想創建一個SQL查詢輸出所有誰在不是唯一的人的ID年齡和經驗的結合。

我迄今爲止代碼:

SELECT Count(*), User_ID FROM Users 
GROUP BY Age,Experience_Level 
HAVING Count(*) > 1 

顯然,這是不完整的,這組非唯一的用戶,但它不會告訴我,他們所有的User_IDs的。

在此先感謝您的幫助!

回答

3

這裏是一個否定的邏輯查詢:

SELECT * 
FROM Users 
WHERE UserID not in 
(
SELECT MIN(UserID) 
FROM Users 
GROUP BY Age, Experience_Level 
HAVING COUNT(*) = 1 
) 
+0

正是我在找的東西,非常感謝你,先生。 – pws5068 2010-07-02 02:13:55

2

由於您想獲得關於多個用戶組的信息,您希望如何返回此數據?在包含逗號分隔的user_id值列表的字符串中?

您沒有用您使用的SQL數據庫品牌標記您的問題。

如果你使用MySQL或SQLite的,您可以使用內置的GROUP_CONCAT()功能:

SELECT Count(*), GROUP_CONCAT(User_ID) AS User_List FROM Users 
GROUP BY Age,Experience_Level 
HAVING Count(*) > 1 

默認情況下,GROUP_CONCAT()與逗號分隔值。如果您想以其他方式格式化,請參閱手冊。

還有其他SQL供應商的解決方案。這個問題已經提出了許多次在Stack Overflow:

+0

曲子user_id'的'從GROUP BY,MySQL的只有與支持的SQLite在GROU隱藏列的遺漏(假設OP在運行查詢時沒有收到錯誤)。 – 2010-07-02 00:58:21

+0

@OMG Ponies:假設'GROUP_CONCAT()'是一個聚合(否則它沒有多大意義),沒有理由不能在其他RDBMS上工作(假設它或類似的東西存在)。 – 2010-07-02 01:03:58

+0

對不起,我應該指定,我正在使用MySql。我從來沒有聽說過Group_Concat,但查詢起作用。我最終使用了David B的分離目的,但我也從中學到了一些東西!謝謝! – pws5068 2010-07-02 02:13:11

1
SELECT t.User_ID, t.Age, t.Experience_Level 
FROM Users t INNER JOIN 
    (SELECT Age, Experience_Level 
    FROM Users 
    GROUP BY Age, Experience_Level 
    HAVING Count(*) > 1) d ON t.Age = d.Age AND t.Experience_Level = d.Experience_Level 

測試腳本:

create table Users (
User_ID int, 
Name varchar(50), 
Age int, 
Experience_Level int 
) 

insert into Users (User_ID, Name, Age, Experience_Level) values (1, 'A', 33, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (2, 'B', 37, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (3, 'C', 33, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (4, 'D', 35, 2) 
insert into Users (User_ID, Name, Age, Experience_Level) values (5, 'E', 33, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (6, 'F', 35, 2) 
insert into Users (User_ID, Name, Age, Experience_Level) values (7, 'G', 18, 1) 
1

從理論上講,你要的是這樣的事情,但遺憾的是SQL Server不允許它:

SELECT * FROM Users 
WHERE (Age, Experience_Level) IN 
(
    SELECT Age, Experience_Level 
    FROM Users 
    GROUP BY Age,Experience_Level 
    HAVING Count(*) > 1 
) 

因此,相反,你不得不接受連結到子查詢:

SELECT Users.* FROM Users 
INNER JOIN 
(
    SELECT Age, Experience_Level 
    FROM Users 
    GROUP BY Age,Experience_Level 
    HAVING Count(*) > 1 
) subq 
    ON Users.Age = subq.Age 
    AND Users.Experience_Level = subq.Experience_Level