2016-04-18 22 views
0

Ich habe Kunden-und Gruppentabellen, in vielen zu vielen Beziehung. Zum Beispiel habe ich Gold Gruppe. Diese Gruppe besteht aus einer Kundeninstanz. Ich brauche eine Liste von Kunden, die nicht in Gold Mitglied sind. Einfache Lösung Ich benutze diese AbfrageErhalten Sie Rest der Daten in vielen zu vielen Beziehung

Diese Lösung am schlimmsten zu sein, wenn meine Datenbank aufwachsen, Tausende Kunden Instanz. Ich brauche einen Vorschlag für einen wirksamen Ansatz für diesen Zustand.

+0

Wie viele Zeilen befinden sich in der Kundentabelle? –

+1

Im schlimmsten Fall. Ich habe 10.000 Kunden. Und 9.999 von ihnen ist Goldmitglied. Wie bekomme ich 1 Kunde, der kein Goldmitglied ist? – windupurnomo

Antwort

0

Die where in Klausel kann sehr ineffizient und schwer auf Ihrer Datenbank und sollte daher vermieden werden. (Siehe Is SQL IN bad for performance?)

Stattdessen sollten Sie join für eine bessere Leistung verwenden:

SELECT * FROM customer 
LEFT JOIN customer_group 
ON customer.customer_id = customer_group.customer_id 
WHERE customer_group.group_id <> 1; 
0

Sie anstelle von Unterabfragen verwenden könnte verbindet:

Select * 
from 
     customer cc 
     inner join customer_group grp on grp.customer_id=cc.customer_id 
where 
    grp.group_id <>1 

Ausführungspläne - Subqueries Kosten größer sind.

enter image description here

0

können Sie verwenden, existiert nicht Abfrage statt, wo in.

Select * from customer c 
    where 
not exists(select customer_id from customer_group g 
     where group_id = 1 and c.id = g.customer_id); 

In diesem finden wir zuerst den Kunden in customer_group mit gleichen customer_id wie c von id und ist auch ein gold Mitglied . Und wenn keine Zeile zurückgegeben wird (es bedeutet, dass sie nicht existiert), geben wir alle ihre Informationen aus der Tabelle customer zurück.

Verwandte Themen