1

私はSOの内外を調べましたが、これができるかどうかはまだわかりません。私はこのようなテーブルを持っています:

User ID | Role | First Name | Last Name | Email |<br>
0001    | K    | John       | Smith     | e@e.co|<br>
0002    | Q    | Jane       | Dickens   | q@q.co|<br>
0003    | K    | John       | Smith     | e@e.co|<br>
0004    | J    | Jack       | Paper     | j@j.co|<br>

ご覧のとおり、ユーザーが2回別々に情報を入力したため、テーブルに重複が含まれています。次の行を表示したい

  • 1.同じ名を持っている
  • 2.同じ名前を持っている
  • 3.同じメールアドレスを持っている
  • 4.同じユーザーIDを持っていない

    最初の3つの条件を内部結合サブクエリで機能させることができますが、4番目の条件を追加しようとすると、0の結果が返されます。

    よろしくお願いします!

  • 4

    5 に答える 5

    0
    SELECT GROUP_CONCAT(`User ID`) as IDs, Role, `First Name`, `Last Name`, Email
    FROM users_table
    GROUP BY Role,`First Name`,`Last Name`,Email
    

    次のようなテーブルを提供します

    IDs       | Role | First Name | Last Name | Email |
    0001,0003 |   K  |    John    |   Smith   | e@e.co|
    0002      |   Q  |    Jane    |  Dickens  | q@q.co|
    0004      |   J  |    Jack    |   Paper   | j@j.co|
    

    トリックは、GROUP BYを除くすべてのものIDです。

    次のこともできます。

    SELECT COUNT(`User ID`) as numIDs, GROUP_CONCAT(`User ID`) as IDs, 
           Role, `First Name`, `Last Name`, Email
    FROM users_table
    GROUP BY Role,`First Name`,`Last Name`,Email
    HAVING numIDs > 1
    

    取得するため

    numIDs |IDs       | Role | First Name | Last Name | Email |
        2  |0001,0003 |   K  |    John    |   Smith   | e@e.co|
    

    とにかく、目的に合わせてどのように変更するかというポイントが得られます。

    于 2012-01-30T05:22:40.683 に答える
    0

    次のようなものを試してください:

    select *
      from tb_users
     where (first_name, last_name, email) in
       (select first_name, last_name, email
          from tb_users
         group by first_name, last_name, email
        having count(*) > 1)
    
    于 2012-01-30T05:23:34.247 に答える
    0

    テーブルに真の重複行が含まれていないと想定しています (ユーザー ID も一致する場合)。関連する行を元に戻すのは、これと同じくらい簡単だと思います(調整された列とテーブルの命名スキームを使用):

    SELECT ui.user_id, ui.role, ui.first_name, ui.last_name, ui.email
    FROM user_info AS ui
      INNER JOIN user_info AS udi
        ON ui.first_name = udi.first_name
          AND ui.last_name = udi.last_name
          AND ui.email = udi.email
          AND ui.user_id != udi.user_id;
    
    于 2012-01-30T05:23:46.010 に答える
    0

    count(*) と group by 句を使用します。

    この SELECT count(*) as countFROM table group by concat(firstname,'\n',last_name) having count=1; のように

    于 2012-01-30T05:26:38.430 に答える
    0

    重複行を削除したいと思います。count by group by のみを取得し、重複行を削除します。

    select * from tb_users
         group by first_name, last_name, email
        having count(*) > 1
    
    于 2012-01-30T05:26:41.827 に答える