2016-12-29 1 views
0

Ich versuche, Daten mit 4 Tabellen zu bekommen. Liste der TabellenAbfrage Ergebnis mit optimierten Weg mit mehreren Tabellen

  • Zahlen
  • Anrufe
  • ref_label_no
  • Etiketten

Ich möchte Daten Anzahl der Anzahl der Anrufe mit speziellen Etiketten angebracht holen. Hier ist Tabelle.
Nummer Tabelle:

select id,uuid,number from numbers limit 1; 
+----+--------------------------------------+------------+ 
| id | uuid         | number  | 
+----+--------------------------------------+------------+ 
| 1 | ed268b05-758e-44fd-b429-8d5223651814 | 1234561222 | 
+----+--------------------------------------+------------+ 

Call-Tabelle

mysql> select id,uuid,did from calls limit 2; 
+----+-------------------------------------+------------+ 
| id | uuid        | number  | 
+----+-------------------------------------+------------+ 
| 1 | ddddass-b810-4f23-7456-8ff56efab080 | 1234561222 | 
| 2 | dddddd-b810-4f23-7456-8ff56efab080 | 123456789 | 
+----+-------------------------------------+------------+ 
2 rows in set (0.02 sec) 

ref_label_no Tabelle

mysql> select uuid,number_uuid,label_uuid from ref_label_no limit 1; 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
| uuid         | number_uuid       | label_uuid       | 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
| 7a5e1b6e-0194-4993-8d78-5f7a1b60c7d2 | ed268b05-758e-44fd-b429-8d5223651814 | 7262b06e-9263-4825-8411-4c107104a60b | 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
1 row in set (0.00 sec) 

Tabelle Etiketten

mysql> select uuid,name from labels limit 1; 
+--------------------------------------+-------+ 
| uuid         | name | 
+--------------------------------------+-------+ 
| 7262b06e-9263-4825-8411-4c107104a60b | INDIA | 
+--------------------------------------+-------+ 
1 row in set (0.00 sec) 

Jetzt möchte ich wie Anrufe Zahl mit insgesamt Anrufe führen. [Dieser Ausgang i benötigt]

mysql> select uuid,name from labels limit 1; 
+--------------------------------------+-------+ 
| Number      | Total_calls | 
+--------------------------------------+-------+ 
| 13456789      |  2  | 
+--------------------------------------+-------+ 
1 row in set (0.00 sec) 

Ich habe unten Abfrage gemacht, aber kein Erfolg auch zu viel Zeit bis zum Ansprechen nehmen.

select count(*) as Total_calls,calls.number as did,labels.name,calls.created_at as callstart from calls, labels JOIN ref_label_no ON labels.uuid = ref_label_no.label_uuid JOIN numbers ON numbers.uuid = ref_label_no.number_uuid where labels.name="INDIA" group by calls.number; 

Irgendwelche Vorschläge oder Empfehlungen?

+0

welche Rolle spielt 'ref_label_no' Tisch spielen? Und warum verwenden Sie UUID, wenn es scheint, dass Sie in diesen Tabellen auch eine Spalte für die automatische Inkrementierung haben. Wenn Sie UUID verwenden, benötigen Sie kein automatisches Inkrement. – e4c5

+0

Die Tabelle ref_label_no enthält alle refrence-Werte wie Nummernlabel und Zahlentabelle uuid. Wir verwenden den Referenzwert für uuid, der nicht auf dem Primärschlüssel basiert. –

+0

Es tut mir leid, dass der Kommentar nicht sehr klar ist – e4c5

Antwort

0

Mehrere Tabellen Verwenden Sie keine Joins, verwenden Sie Union. Es wird schneller als beitreten.

Wie diese

select uuid,did from calls union 
select uuid,number_uuid as did from ref_label_no union 
select uuid,name as did from labels 
+0

aber mein Ergebnis auch falsch angezeigt, wollen nur Ergebnis aus der Aufruftabelle, aber nach Labels, alle Referenzabfragen mit Union? –

+0

Wo gilt wo? Soll ich einen Tabellenalias verwenden? –

0
SELECT COUNT(calls.uuid) as total_calls, numbers.number 
FROM numbers JOIN calls ON numbers.number = calls.number 
JOIN ref_label_no ON ref_label_no.number_uuid = numbers.uuid 
JOIN labels ON labels.uuid = ref_label_no.label_uuid 
WHERE labels.name="INDIA" 
GROUP BY numbers.number; 

Da wir die Gesamtzahl der Anrufe Berechnung von Zahlen Gruppierung, werden Sie nicht die Möglichkeit haben calls.created_at im Abfrageergebnis zu wählen, weil es mit Konflikten die Aggregationsfunktion COUNT.

Die folgende Abfrage verwenden VORHANDEN Bedingung:

SELECT COUNT(calls.uuid) as total_calls, numbers.number 
FROM calls JOIN numbers ON numbers.number = calls.number 
WHERE EXISTS(SELECT 1 FROM ref_label_no JOIN labels ON labels.uuid = ref_label_no.label_uuid 
WHERE labels.name="INDIA" AND numbers.uuid = ref_label_no.number_uuid) 
GROUP BY numbers.number; 
+0

Diese Abfrage verwendet, In meiner Anruftabelle haben etwa 1 lk Datensatz, und es dauert etwa 8 Minuten, um Datensätze abzurufen. In meinem Fall funktioniert das nicht. –

+0

Welche Indizes haben Sie in Ihren Tabellen? Das Fehlen von Indizes in Tabellen ist der Hauptkiller. Und hat es Ihnen die richtigen Ergebnisse zurückgegeben? – bean

+0

Angewandte Indexierung jetzt. Wie wir diese Abfrage abholen den Datensatz in "20 Zeilen in Satz (7,64 sec)" mal. Noch 7 Sekunden sind sehr groß. –

Verwandte Themen