1

次のクエリを使用して、同じ姓名を持つすべての重複レコードを返します。秘訣は、contact_idが降順である必要があるということです。

クエリは期待どおりに連絡先を返しますが、それはとても遅いです!約30,000レコードをチェックする場合、約6〜8秒かかります。

私はcontact_firstName、contact_lastName、contact_client_id、contact_idをすべてデータベースにインデックス付けしています。

これを少しスピードアップするために私ができることはありますか?ご協力いただきありがとうございます :)

SELECT z.contact_id, z.contact_firstName, z.contact_lastName, RIGHT(z.contact_lastName,1) AS nameNum
FROM (`contacts` x) 
JOIN `contacts` z ON `x`.`contact_firstName` = `z`.`contact_firstName` 
AND x.contact_lastName = z.contact_lastName 
AND x.contact_client_id = ".$ID." 
AND z.contact_client_id = ".$ID." 
WHERE `x`.`contact_id` < `z`.`contact_id` 
GROUP BY `z`.`contact_id` 
4

2 に答える 2

1

約束はしませんが、代わりに次の方法を試してみてください。

SELECT c.contact_id, c.contact_firstName, c.contact_lastName, RIGHT(c.contact_lastName,1) AS nameNum
    FROM (SELECT contact_firstName, contact_lastName, MIN(contact_id) AS MinID
              FROM contacts
              WHERE contact_client_id = ".$ID."
              GROUP BY contact_firstName, contact_lastName
              HAVING COUNT(*) > 1) t
        INNER JOIN contacts c
            ON t.contact_firstName = c.contact_firstName
                AND t.contact_lastName = c.contact_lastName
                AND c.contact_client_id = ".$ID."
                AND t.MinID <> c.contact_id
于 2011-06-09T21:03:11.623 に答える
0
SELECT z.contact_id, z.contact_firstName, z.contact_lastName
, RIGHT(z.contact_lastName,1) AS nameNum
FROM `contacts` x
JOIN `contacts` z ON (x.contact_client_id = z.contact_client_id)
WHERE `x`.`contact_id` < `z`.`contact_id` 
And x.contact_client_id = '$id'
GROUP BY `z`.`contact_id` 

インデックスがあることを確認してください:
- contact_id。
- contact_client_id

于 2011-06-09T20:58:32.690 に答える