[mysql] Join mit 5 Tabellen

Daywood

Grünschnabel
Hallo zusammen,


ich habe ein Problem mit einer Abfrage, welche mir die Fehlermeldung
SQL:
The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay
ausgibt. Ich habe nun schon eine Zeit mit "meiner" Abfrage gearbeitet, allerdings vermute ich, dass ich jetzt zu viele Daten in den Tabellen habe, wodurch dieser Fehler nun auftritt.
Erstmal eine kurze Erklärung was ich machen will. Es handelt sich um eine Kurierdienstsoftware, wo ich die Abrechnungen für die Fahrer ausgeben möchte. Die Abrechnung wurde also schon erstellt. Die Struktur ist folgende: Es gibt Aufträge (Tabelle "auftrag"), welchen die Stops (z.B. Absender 1, Empfänger 1, Empfänger 2; Tabelle "auftrag_stops"), die Fahrer (z.B. Fahrer 1, Fahrer 2; Tabelle "auftrag_fahrer") und die jeweilige Abrechnung, auf der der Auftrag enthalten ist (Tabelle "abrechnung") zugeordnet sind. Folgendes soll nun gemacht werden:
Ich möchte mir anhand der ID der Abrechnung alle Aufträge, die dieser Abrechnung (mit der Tabelle auftrag_abrechnung) zugeordnet sind, ausgeben. Dazu soll der Preis des Fahrers, zu dem die Abrechnung gehört, und der zum Auftrag gehört, ausgegeben werden. Das ganze soll dann noch nach dem timestamp des 1. Stops des jeweiligen Auftrages sortiert werden. Außerdem enthält jede Tabelle noch die Spalte "firma", welche die ID der Firma gehört, der der jeweilige Datensatz zugeordnet ist. Dies halte ich für notwendig, da verschiedene Kurierfirmen sich die Datenbank teilen und ich einen Zugriff auf fremde Daten vermeiden will. Die ID der Firma kommt aus der jeweiligen Session des angemeldeten Benutzers. Das ganze soll dann noch nach dem Datum des zum jeweiligen Auftrag gehörenden ersten Stops (pos = 1) sortiert werden.

Hier ist meine Abfrage:
SQL:
SELECT 
auftrag_stops.ab_ts AS datum, 
auftrag.id AS id, 
auftrag.tarif_id AS tarif, 
auftrag_fahrer.preis AS preis 
FROM auftrag, auftrag_fahrer, auftrag_stops, abrechnung, auftrag_abrechnung 
WHERE 
(auftrag_abrechnung.abrechn_id = '14' AND auftrag_abrechnung.firma = '2') AND 
(abrechnung.id = '14' AND auftrag_abrechnung.firma = '2') AND 
(auftrag_fahrer.auftr_id = auftrag.id AND auftrag_fahrer.firma = '2') AND 
auftrag_fahrer.fahrer_id = abrechnung.fahrer_id AND 
auftrag.id = auftrag_abrechnung.auftr_id AND 
auftrag_stops.auftr_id = auftrag.id AND 
auftrag_stops.pos = '1' ORDER BY datum

Hier die dazugehörigen Tabellen:

auftrag
SQL:
id	firma
1	2
2	2
3	2

auftrag_fahrer
SQL:
id	fahrer_id	auftr_id	preis	firma
1	1	1	15.00	2
2	1	2	20.00	2
3	1	3	12.50	2
4	2	3	12.50	2

auftrag_stops
SQL:
id	auftr_id	pos	datum	firma
1	1	1	1234567890	2
2	1	2	1234567891	2
3	2	1	1234567895	2
4	2	2	1234567896	2
5	3	1	1234567897	2
6	3	2	1234567899	2
7	3	3	1234567900	2

auftrag_abrechnung
SQL:
id	auftr_id	abrechn_id	firma
1	1	1	2
2	2	1	2
3	3	1	2

abrechnung
SQL:
id	fahrer_id	firma
1	1	2


Ich vermute, dass das ganze über Joins funktioniert, habe allerdings nicht wirklich eine Ahnung wie. Ich habe schon einige Tutorials gelesen, finde aber nichts mit mehreren Tabellen. Ich wäre sehr froh wenn mir jemand dabei helfen könnte. Die mysql-Version ist MySQL-Client-Version: 5.0.51a.

Vielen Dank schonmal.

Gruß David
 
Hi David,

du nutzt ja bereits JOINs allerdings eine veraltete Schreibweise.
SQL:
auftrag_fahrer.fahrer_id = abrechnung.fahrer_id AND 
auftrag.id = auftrag_abrechnung.auftr_id AND 
auftrag_stops.auftr_id = auftrag.id

Ich übersehe gerade deinen Aufbau nicht so richtig aber du könntest es mit SUB-SELECT versuchen um die Anzahl der Rows zu minimieren bevor du JOIN einsetzt.
 
Zuletzt bearbeitet von einem Moderator:
Ja, das habe ich jetzt auch schon rausgefunden, dass ich einen Join nutze. SUB-SELECTS hatte ich auch schon überlegt, hatte allerdings gelesen, dass diese sehr Resourcenraubend sind. Gibt es nicht noch eine andere Möglichkeit? Was genau verstehst du denn nicht? Vielleicht kann ich es irgendwie besser erklären?!
 
Zurück