0

次のクエリを使用して重複を見つけました。

SELECT userID,
COUNT(userID) AS NumOccurrences
FROM userDepartments
GROUP BY userID
HAVING ( COUNT(userID) > 1 )

次に、内部結合を追加して、一致するユーザー名が別のテーブルに格納されていることを確認できるようにしました。

SELECT userDepartments.userID, users.firstname, users.lastname,
COUNT(userID) AS NumOccurrences
FROM userDepartments INNER JOIN users ON userDepartments.userID = users.userID
GROUP BY userID
HAVING ( COUNT(userID) > 1 )

しかし、users.firstnameが何らかの集計関数などの一部ではないというエラーが表示されました...

カウントを取得し、複数の部門を持つユーザーのみを表示し、他のテーブルから姓名を取得して、複数の部門が割り当てられているユーザー名のリストを取得する方法を知っている人はいますか?

編集:これは私のために働くことになった質問です...

SELECT     firstname, lastname
FROM         tbl_users
WHERE     (userID IN
                          (SELECT     userID
                            FROM          tbl_usersDepts
                            GROUP BY userID
                            HAVING      (COUNT(userID) > 1)))
4

8 に答える 8

5

クエリを少し並べ替えます....

SELECT
    duplicates.NumOccurrences,
    duplicates.userID,
    users.firstname,
    users.lastname
FROM (
    SELECT
        userID,
        COUNT(userID) AS NumOccurrences
    FROM userDepartments
    GROUP BY userID
    HAVING COUNT(userID) > 1
) duplicates
INNER JOIN users ON duplicates.userID = users.userID
于 2009-02-06T20:58:33.890 に答える
2

SQLエンジンは、ユーザーIDごとにユーザー名が1つしかないことを認識しないため、ユーザーIDだけでなく、名と姓でグループ化する必要があります。

SELECT userDepartments.userID, users.firstname, users.lastname,
COUNT(userID) AS NumOccurrences
FROM userDepartments INNER JOIN users ON userDepartments.userID = users.userID
GROUP BY userID, users.firstname, users.lastname
HAVING ( COUNT(userID) > 1 )

名と姓でグループ化しない場合、エンジンは、特定のユーザーIDに対して複数の名の値を取得した場合に何をすべきかを認識しません。3つの値すべてでグループ化するように指示することで、ユーザーIDごとに複数の行がある場合、それらすべての行を返す必要があることがわかります。これは起こらないはずですが、この場合、エンジンはそれを自分で決定するほど賢くはありません。

次のようにすることもできます。

SELECT users.userId, users.firstname, users.lastname, departments.NumOccurrences
FROM users INNER JOIN (
     SELECT userId, count(userId) as NumOccurrences 
     FROM userDepartments 
     GROUP BY userID 
     HAVING ( COUNT(userID) > 1 )
) departments ON departments.userID = users.userID
于 2009-02-06T20:54:03.057 に答える
1

userDepartments.userID、users.firstname、users.lastnameの3つすべてでグループ化します。

于 2009-02-06T20:53:42.043 に答える
0

GROUP BY句にuser.firstnameとusers.lastnameを含める必要があります。これらは集計値ではないためです(MySQLはクエリで使用した構文を実際にサポートしていますが、標準ではないことに注意してください)。

于 2009-02-06T20:54:12.353 に答える
0

「groupby」を実行する場合、「select」部分のすべては次のいずれかである必要があります。

  1. 「groupby」句で言及されている、または

  2. 集計関数の結果(count()など)

于 2009-02-06T20:54:45.050 に答える
0

私はこのようにします(Oracleでは、これがシステムで機能しない場合に備えて):

SELECT users.userID, users.firstname, users.lastname, NumOccurrences
  FROM users
       INNER JOIN (
         SELECT userID, COUNT(userID) AS NumOccurrences
           FROM userDepartments
           GROUP BY userID
           HAVING ( COUNT(userID) > 1 )
       ) d
       ON d.userID = users.userID
于 2009-02-06T20:59:38.833 に答える
0

あなたの名前フィールドを group by に追加することについての良いメモがたくさんあります。ただし、次のようにすると思います。

SELECT Users.*, dups.NumOccurances, ud.DepartmentName
FROM Users
INNER JOIN
  (
    SELECT userID, COUNT(userID) AS NumOccurrences
    FROM userDepartments
    GROUP BY userID
    HAVING ( COUNT(userID) > 1 )
  ) dups ON dups.userID = Users.UserID
INNER JOIN userDepartments ud ON ud.UserID=Users.UserID
ORDER BY Users.LastName, Users.FirstName, Users.UserID

このアプローチの理由の 1 つは、後で戻って、必要な他の情報を簡単に取得できることです。

于 2009-02-06T20:59:45.807 に答える
0

user.Firstname と User.lastname を group by 句に追加します

于 2009-02-06T21:00:13.107 に答える