2017-04-11 4 views
0

Ich habe 4 Tabellen (1 zu viele): Sag nichts über diese "E-Mail" -Beziehung. So hat mein Entwickler-Chef es vor Jahren aufgebaut.MYSQL Stuck Generierung temporäre Tabelle (massive Abfrage)

EMPLOYEES (+-50 results) 
------------------------------------------------ 
id name  
1  EmpName 1 
2  EmpName 2 

CUSTOMERS (+50k results) 
------------------------------------------------ 
id name email   employee_assigned 
1  John [email protected]  12 
2  Donald [email protected] 6 

INTERESTS_CATEGORIES (+650k results) 
------------------------------------------------ 
id customer_email category_id 
1  [email protected]  97 
2  [email protected]  13 
3  [email protected] 56 
4  [email protected] 126 
5  [email protected] 45 

INTERESTS_PRODUCTS (+650k results) 
------------------------------------------------ 
id customer_email product_id 
1  [email protected]  78 
2  [email protected]  23 
3  [email protected] 19 
4  [email protected] 56 
5  [email protected] 45 

Also brauche ich die Kunden von den ihnen zugewiesenen Mitarbeiter und ihre Interessen zu filtern. Und hier ist die Abfrage:

SELECT 
    * 
FROM   
(
    SELECT 
     customers.id      AS 'id', 
     customers.name      AS 'first_name', 
     customers.email, 
     employees.id      AS 'employee_id' 
    FROM 
     customers, 
     employees 
    WHERE 
     employees.id = 2 
     AND 
     customers.employee_assigned = employees.id 
) AS myCustomers 

LEFT JOIN interests_categories 
    ON interests_categories.customer_email = myCustomers.email 
LEFT JOIN interests_products 
    ON interests_categories.customer_email = myCustomers.email 
WHERE  
( 
    interests_categories.category_id = 20 
    OR 
    interests_categories.category_id = 21 
) 

GROUP BY myCustomers.email 

Also, das Problem:

  • Wenn der Arbeitnehmer eine geringe Anzahl von zugewiesenen Kunden (wie 3) Abfrage ist erfolgreich hat.

  • Wenn der Mitarbeiter eine mittelhohe Anzahl von zugewiesenen Kunden (über 100) hat, stach ab.

ich ausführen PROCESS SHOW und es wird stucked "temp Tabelle generieren".

Wer hat eine Idee? :( Danke

+0

der Unterabfrage befreien Sie sich und benutzen Sie einfach schließt sich Verwenden Sie anstelle des OR in der where-Klausel auch IN. Last Stellen Sie sicher, dass Sie Indizes für die E-Mail-Spalten in jeder Tabelle und für alle Spalten haben, die in den WHERE- oder ON-Klauseln verwendet werden. –

+0

Ich werde es versuchen. Danke für die Antwort. :) –

Antwort

0

Überprüfen Sie die Indizes für Tabellen und versuchen Sie dies:..

SELECT 
    c.id AS 'id', 
    c.name AS 'first_name', 
    c.email, 
    e.id AS 'employee_id' 
    ic.*, 
    ip.* 
FROM customers c 
JOIN employees e 
ON c.employee_assigned = e.id 
LEFT JOIN interests_categories ic 
    ON ic.customer_email = c.email 
LEFT JOIN interests_products ip 
    ON ic.customer_email = c.email 
WHERE  
( 
    ic.category_id IN (20,21) 
    AND e.id = 2 
) 
GROUP BY myCustomers.email 
+0

Im besten Fall ist es irreführend, eine GROUP BY-Klausel in eine Abfrage ohne Aggregierungsfunktionen aufzunehmen. – Strawberry

+0

Nun, ich weiß etwas über SQL, aber ich bin nicht Herr. Meine Arbeit ist PHP und Jquery Plugins Dev, aber jetzt bin ich alleine hier ohne SQL Master-Unterstützung. Also habe ich eine sehr große Abfrage gefunden, die nicht funktioniert. (sry für mein Englisch) –

+0

@Sloan, Hinzufügen von Indizes zu E-Mails funktioniert, funktioniert aber meine alte Abfrage, nicht Ihre. Ich werde versuchen, deine Arbeit zu machen, weil meine nicht die Ergebnisse zeigt, die ich will. –

0

übrigens ein weniger stumm Design aussehen könnte wie folgt Wenn es mir war, habe ich mit diesem beginnen würde und CREATE und INSERT-Anweisungen entsprechend richtig Vertreter liefern auch, ich bin gespannt, wo category_id herkommt -.., denn das ist möglicherweise ein Bereich für eine weitere Optimierung

EMPLOYEES 
------------------------------------------------ 
employee_id name  
      6 EmpName 1 
     12 EmpName 2 

CUSTOMERS 
------------------------------------------------ 
customer_id name email   employee_assigned 
      1 John [email protected]     12 
      2 Donald [email protected]     6 

INTERESTS_CATEGORIES 
------------------------------------------------ 
customer_id category_id 
      1   97 
      1   13 
      2   56 
      2   126 
      2   45 

INTERESTS_PRODUCTS 
------------------------------------------------ 
customer_id product_id 
      1   78 
      1   23 
      2   19 
      2   56 
      2   45 
+0

Weniger dummes Design? Was bedeutet das? Ich bin relativ neu bei stackoverflow. category_id stammt aus einer assoziativen Tabelle namens name. category_id 1 bedeutet zum Beispiel Computer, Kategorie 2 Kinderspielzeug usw. –

+0

Nun, das entfernt die "E-Mail-Beziehung", nicht wahr? Also, weniger dumm. – Strawberry

+0

Ich kann das nicht tun. Ich habe gesagt, dass dies eine alte mega große Datenbank ist. Neue Kunden werden alle 1 Stunde synchronisiert, aber Interessen werden zuvor in einem langwierigen Prozess eingefügt. Wenn also das Interesse eingefügt wird, kennen Sie nur die E-Mail, nicht die ID. Ich muss mit dem arbeiten, was ich habe. Ich kann keine großen Änderungen vornehmen, da dies zu großen Fehlern und verschwendeter Zeit führen kann. –

Verwandte Themen