2009-08-07 1 views
0

Ich finde, dass beim Versuch, komplexe MySQL-Joins und Gruppen zwischen vielen Tabellen zu erstellen, ich in der Regel Streit und viel "Versuch und Irrtum" Zeit, um das gewünschte Ergebnis zu erzielen.Der beste Ansatz, um komplexe MySQL Joins und Gruppen zu erstellen?

Ich fragte mich, wie andere Leute die Probleme angehen. Isolieren Sie die kleineren Datenblöcke am Ende der Zweige und lassen Sie diese zuerst arbeiten? Oder fangen Sie mit dem an, was Sie zurückgeben möchten, und fangen Sie einfach an, Tabellen so zu verknüpfen, wie Sie sie brauchen.

Ich frage mich auch, ob es irgendwelche guten Bücher oder Seiten über die Annäherung an das Problem gibt.

Antwort

1

ich arbeite nicht in mySQL, aber ich schreibe häufig äußerst komplexe SQL und hier ist, wie ich es angehen.

Zunächst gibt es keinerlei Ersatz für das Verständnis Ihrer Datenbankstruktur.

Als nächstes versuche ich, die Aufgabe in Stücke aufzuteilen.

Angenommen, ich schreibe einen Bericht über die Einzelheiten einer Besprechung (die Firma, für die ich arbeite, plant die Besprechung). Ich werde den Namen des Meetings und den Vertriebsmitarbeiter, den Veranstaltungsort und die Termine, die Personen, die teilgenommen haben, und die Informationen zum Referenten kennen.

Zuerst ermittele ich, welche der Tabellen die Informationen für jedes Feld im Bericht enthält. Jetzt weiß ich, was ich zusammen machen muss, aber noch nicht genau wie es jetzt ist.

Also zuerst schreibe ich eine Abfrage, um die Meetings zu bekommen, die ich will. Dies ist die Grundlage für den Rest des Berichts, also fange ich dort an. Nun kann der Rest des Berichts wahrscheinlich in beliebiger Reihenfolge ausgeführt werden, obwohl ich lieber die Teile durcharbeite, die zuerst eine Beziehung haben sollten, also werde ich als nächstes die Verknüpfungen und die Felder hinzufügen, die mir alle zugehörigen Vertriebsmitarbeiter bringen Information.

Angenommen, ich möchte nur einen Rep pro Meeting (wenn mehrere Reps vorhanden sind, möchte ich nur das Haupt), also überprüfe ich, ob ich immer noch die gleiche Anzahl von Datensätzen zurücksende wie zu der Zeit . Wenn nicht, schaue ich auf meine Verbindungen und entscheide, welche mir mehr Datensätze gibt, als ich brauche. In diesem Fall könnte es sich um die Adresstabelle handeln, da wir mehrere Adressen für die Repräsentation speichern. Ich passe dann die Abfrage an, um nur einen zu erhalten.Dies kann einfach sein (Sie können ein Feld haben, das die spezifische eindeutige Adresse angibt, die Sie möchten, und daher nur eine WHERE-Bedingung hinzufügen müssen), oder Sie müssen möglicherweise einige Gruppierungs- und Aggregatfunktionen ausführen, um zu erhalten, was Sie wollen.

Dann gehe ich weiter zum nächsten Chunk (arbeite zuerst durch alle Chunks, die ein 1-1 relationshis zu den zentralen Daten in diesem Fall das Meeting haben sollten). Führen Sie eine Abfrage durch und überprüfen Sie die Daten nach jedem Hinzufügen.

Schließlich gehe ich zu den Datensätzen, die eine Eins-Viele-Beziehung haben können, und füge sie hinzu. Wieder führe ich die Abfrage aus und überprüfe die Daten. Zum Beispiel könnte ich die Rohdaten für ein bestimmtes Meeting überprüfen und sicherstellen, dass meine Anfrage genau das liefert, was ich erwarte.

Angenommen, in einer dieser Ergänzungen eines Join finde ich die Anzahl der verschiedenen Sitzungen gesunken ist. Hoppla, dann gibt es keine Daten in einer der Tabellen, die ich gerade hinzugefügt habe, und ich muss das in eine linke Verknüpfung ändern.

Ein anderes Mal kann ich finden zu viele Datensätze zurückgegeben. Dann schaue ich, ob meine where-Klausel mehr Filterinformationen benötigt oder ob ich eine aggregate-Funktion verwenden muss, um die Daten zu erhalten, die ich brauche. Manchmal füge ich dem Bericht vorübergehend andere Felder hinzu, um zu sehen, ob ich sehen kann, was die doppelten Daten verursacht. Dies hilft mir zu wissen, was angepasst werden muss.

Der eigentliche Schlüssel ist, langsam zu arbeiten, Ihr Datenmodell zu verstehen und die Daten zu überprüfen, nachdem jeder neue Chunk hinzugefügt wurde, um sicherzustellen, dass die Ergebnisse so zurückgegeben werden, wie Sie es für richtig halten.

Manchmal, wenn ich eine Menge Daten zurücksende, werde ich vorübergehend eine zusätzliche where-Klausel in die Abfrage einfügen, um sie auf einige wenige Elemente zu beschränken, die ich leicht überprüfen kann. Ich empfehle auch stark die Verwendung von order by, weil es Ihnen hilft, zu sehen, wenn Sie doppelte Datensätze erhalten.

+0

Vielen Dank für Ihre Meinung. Das ist toll. :) – Das123

0

Ich habe sie nicht genutzt, mich auf ihre Wirksamkeit so nicht sagen, aber vielleicht eine GUI-basierte Query Builder wie dbForge oder Code Factory helfen könnte?

Und während die Verwendung von Venn-Diagrammen zum Nachdenken über MySQL-Joins nicht unbedingt mit SQL hilft, können sie helfen, die Daten zu visualisieren, die Sie versuchen zurückzuziehen (siehe Jeff Atwood's post).

1

Nun der beste Weg, um Ihre MySQL-Abfrage zu brechen, ist die EXPLAIN Befehl ausführen sowie Blick auf die MySQL-Dokumentation für Optimization with the EXPLAIN Befehl.

MySQL bietet einige große kostenlose GUI tools ebenso, der MySQL Query Browser ist, was Sie brauchen zu verwenden.

Wenn Sie den EXPLAIN-Befehl ausführen, wird die Art und Weise, in der MySQL Ihre Abfrage interpretiert, und die Komplexität angezeigt. Es kann einige Zeit dauern, die Ausgabe zu dekodieren, aber das ist eine andere Frage an sich.

Wie für ein gutes Buch würde ich empfehlen: High Performance MySQL: Optimization, Backups, Replication, and More

Verwandte Themen