Frage

Ich habe folgende Tabellen:

Table 1 : Contacts
Fields : id  first_name

Values : 

1    Reeta
2    Rohan
3    John 

Table 2 : email (it contains contact_id of contacts table)
Fields : id   contact_id  email_address

Values :

1  1  r@gmail.com
2  2  r@gmail.com
3  3  j@gmail.com

I want to display all duplicates by email. Like this:

cont_id  first_name  email_address

   1        Reeta  r@gmail.com
   2        Rohan  r@gmail.com

Hier ist meine Anfrage:

select contact_id 
from contacts 
where email_address IN (
  SELECT S.email_address 
  FROM  contacts R
  INNER JOIN email
    ON R.id = S.contact_id 
  Group By email_address
  Having Count(S.id) > 1
); 

Die Ausführung der Abfrage dauert bei einer großen Anzahl von Datensätzen lange.Allerdings funktioniert die innere Abfrage schneller, nicht jedoch die äußere.Bitte helfen Sie.

War es hilfreich?

Lösung

Ja, es ist das Problem mit dem MySQL-Abfrageoptimierer.Die Sache ist - IN (subquery) für MySQL ist dasselbe wie = ANY () Unterabfrage.Und MySQL optimiert das nicht, selbst wenn die Unterabfrage nur wenige Werte zurückgibt, die im Normalfall leicht über den Index verglichen werden können (sofern er in der Spalte vorhanden ist, für die wir arbeiten). IN).

Verwechseln Sie das nicht mit IN (<static values list>) - Ganz anders verhält es sich, wenn MySQL damit umgeht IN nicht als spezifische Art von Unterabfrage, sondern als Vergleichsoperator – und daher Wille Index verwenden.

Daher besteht eine der möglichen Lösungen darin, Ihre Unterabfrage zu trennen, damit sie eine Liste mit Werten zurückgibt, und diese Liste dann durch zu ersetzen IN (), wegen der Behandlung wird ein Index-Scan durchgeführt IN als Vergleichsoperator.In einigen Fällen kann die Lösung jedoch durch Ersetzen der Unterabfrage durch erreicht werden JOIN.Dies ist nicht in allen Fällen möglich, daher ist die oben beschriebene Lösung für häufige, nicht triviale Fälle geeignet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top