2016-07-14 4 views
0

私は45の列を持つテーブルを持っています。列SrNoprimary keyです。それは何百万という記録を持っています。それは非常に多くの重複を含んでいます。私は実際に一意の値を見つけて、別のテーブルに挿入したいと思っています。列First-Middle-Last NameEmails(オフィス、個人)、MobileNumbersには非常に多くの重複が含まれています。私は以下のクエリを使用して一意の値を見つけようとしていますが、依然として重複の結果を示しています。誰かが私を助けてくれるのですか?MySQLのテーブルの複数の列から一意のレコードを見つける方法

SELECT ft.first_name 
    , ft.middle_name 
    , ft.last_name 
    , ft.designation 
    , ft.company_name 
    , ft.email_office 
    , ft.email_personal1 
    , ft.email_personal2 
    , ft.personal_mobile1 
    , ft.personal_mobile2                   
    FROM mytable ft  
    JOIN 
    (SELECT First_Name 
      , Middle_Name 
      , Last_Name 
      , designation 
      , Company_Name 
      , Email_Office 
      , Email_Personal1 
      , Email_Personal2 
      , Personal_Mobile1 
      , Personal_Mobile2 
      , COUNT(*) 
     FROM mytable 
     GROUP 
      BY First_Name 
      , Middle_Name 
      , Last_Name 
      , designation 
      , Company_Name 
      , Email_Office 
      , Email_Personal1 
      , Email_Personal2 
      , Personal_Mobile1 
      , Personal_Mobile2 
     HAVING COUNT(*) = 1 
    ) temp 
    ON temp.first_name = ft.First_Name 
    AND temp.middle_name = ft.Middle_Name 
    AND temp.last_name = ft.Last_Name 
    AND temp.designation = ft.Designation 
    AND temp.company_name = ft.Company_Name 
    AND temp.email_office = ft.Email_Office 
    AND temp.email_personal1 = ft.Email_Personal1 
    AND temp.email_personal2 = ft.Email_Personal2 
    AND temp.personal_mobile1 = ft.Personal_Mobile1 
    AND temp.personal_mobile2 = ft.Personal_Mobile2 
WHERE srno <= 1000;  

これは数百万ものため、fulldataのクエリを実行するのに時間がかかります。ザッツ私はEmailsで重複を示す1000

その、あまりにもNamesの3列件までレコードを表示するwhere条件を入れてきた理由。誰もこのクエリで何が間違って助けることができますか?または私はそれをこのように複雑にしていますか?

また、count(*) > 1のレコードを取得するには、他の重複を無視しながらレコードを1つだけ取るにはどうすればよいですか?

以下は私のサンプル表です。

+-----------+------------+----------+-------------------+-------------+----------------+-----------------+---------------------+------------+------------+ 
| FirstName | MiddleName | LastName | Designation  | CompanyName | Email(o)  | Email(P1)  | Email(P2)   | Mobile(pl) | Mobile(p2) | 
+-----------+------------+----------+-------------------+-------------+----------------+-----------------+---------------------+------------+------------+ 
| Anil  |   |   | Personnel Manager | ABC   | anilgabc.com | anilggmail.com |      | 9898989898 |  | 
| Anil  | D   | Gupta | Personnel Manager | ABC   | anilggmail.com |   |    |  |  | 
| Anil  | D   |   |     | ABC   | [email protected] |   |    |  |  | 
| Anil  |   | Gupta | Personnel Manager |    |    |     | anilgreditfmail.com | 9898989898 |  | 
| Anil  |   | Gupta |     | ABC   |    |     |      | 9898989898 |  | 
| Anil  | D   | Gupta | Personnel Manager | ABC   | anilgabc.com | [email protected] | anilgrediffmail.com | 9898989898 |  | 
+-----------+------------+----------+-------------------+-------------+----------------+-----------------+---------------------+------------+------------+ 

そして、ここではあなたが必要とする同じレコードが最初に、他のテーブルを結合する複数持つテーブルのための明確な目的の結果...

+0

名前またはミドルネームまたは姓または電子メール。またはFirst + last + Middlle + emailの固有の組み合わせ –

+0

私は一意のレコード(行)全体がこれらすべてのフィールドの組み合わせを意味します。 –

答えて

0

使用です。このような,,

 

    select distinct ft.first_name,ft.middle_name,ft.last_name,ft.designation,ft.company_name,ft.emai l_office,ft.email_personal1, ft.email_personal2, ft.personal_mobile1,  ft.personal_mobile2                   
     from mytable ft and so on 




あなたが最初のユニークたいフィールドenter image description here

enter image description here

+0

私はdistinctを使用しようとしましたが、うまくいきませんでした。まだ重複したレコードが表示されていました。しかしその時、私は他のテーブルに参加しませんでした。このようにしてみましょう。数分であなたに戻ってください。もう1つのこと、なぜ1000レコードしか実行できないのですか?私は合計1100000のレコードを持っています。 –

+0

複数の重複レコードを持つテーブルを最初に実行し、distinct inを使用します。最初にプライマリキーを持つ複数のレコードを持つ特定の列を照会し、distinctを使用して、同じテーブルで全体を結合すると、確実に最良の結果を得ることができます。 –

+0

試してみてください。私のサブクエリでは、 "count(*)= 1"は正しいですか?カウント(*)> 1?のレコードからは、どのようにして1つのレコードしか得られませんか? "have count(*)> = 1"と書かなければなりませんか? –

関連する問題