Frage

Ich habe eine Tabelle von Benutzern die folgenden Spalten enthält:

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

Ich mag eine SQL-Abfrage zur Ausgabe erstellen alle IDs von Menschen, die in der Kombination von Alter und Erfahrung nicht eindeutig zuzuordnen sind.

Mein Code so weit:

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

Dies ist offensichtlich unvollständig, wird diese Gruppe der nicht eindeutigen Benutzer, aber es wird mir sagen, nicht alle ihre benutzerkennungen.

Vielen Dank im Voraus für Ihre Hilfe!

War es hilfreich?

Lösung

Hier ist eine negierte logische Abfrage:

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

Andere Tipps

Da Sie Informationen über Gruppen von mehreren Benutzern wollen, wie wollen Sie diese Daten zurückgegeben? In einer Zeichenkette mit durch Kommata getrennte Liste von user_id Werten?

Sie haben nicht mit der Marke von SQL-Datenbank markieren Sie Ihre Frage, die Sie verwenden.

Wenn Sie MySQL oder SQLite verwenden, können Sie die eingebaute in GROUP_CONCAT() Funktion:

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

Standardmäßig trennt GROUP_CONCAT() die Werte durch Kommas. Lesen Sie im Handbuch, wenn Sie wollen, dass es eine andere Art und Weise formatiert.

Es gibt andere Lösungen für anderen SQL-Anbieter. Diese Frage hat viele Male auf Stack-Überlauf kommen:

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

Test-Skript:

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)

In der Theorie, was Sie wollen, ist so etwas wie diese, aber leider SQL Server erlaubt es nicht:

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

Also statt, müssen Sie settle zu einer Unterabfrage Beitritt:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top