in meiner Weltmarktapplikation „Sportwagenmanager“ benutze ich eine Tabelle mit Sportwagen id und name und eine Tabelle Fahrer mit id und Name. Ausserdem gibt es eine Tabelle Sportwagen_Fahrer_rel mit id, idSportwagen und idFahrer, die beide miteinander verknuepft. Ungefaehr so:
Ziel ist jetzt, eine Matrix zu erstellen, in der in der ersten Zeile alle Sportwagen stehen, in der ersten Spalte alle Fahrer und ueberall dort eine 1 (oder X oder was auch immer), wo ein Fahrer per Sportwagen_Fahrer_rel mit dem Sportwagen verknuepft ist.
Meine stuemperhaften Versuche sehen bis jetzt so aus, dass ich zuerst alle Sportwagen in ein array stopfe, anschliessend alle Fahrer und dann mit i und j ueber beide arrays iteriere und
SELECT 1 FROM Sportwagen\_Fahrer\_rel WHERE idSportwagen = (SELECT id FROM Sportwagen WHERE name = '$i') AND idFahrer = (SELECT id FROM Fahrer WHERE name = '$j')
Das dauert natuerlich ewig. (Dazu muss man vielleicht wissen, dass ich ungefaher 3000 Sportwagen und 400 Fahrer habe, also >1Mio. zur MySQL renne.)
Kann MySQL das vielleicht auch irgendwie besser, schneller, eleganter?
SELECT 1
FROM Sportwagen\_Fahrer\_rel
WHERE idSportwagen = (SELECT id
FROM Sportwagen
WHERE name = '$i')
AND idFahrer = (SELECT id
FROM Fahrer
WHERE name = '$j')
sollte doch ein einfaches
select s.id, s.name, f.id, f.name
from Sportwagen\_Fahrer\_rel r,
Sportwagen s,
Fahrer f
where r.idSportwagen = s.id
and r.idFahrer = r.id
reichen und bei entsprechenden Indizies, sollte die Abfrage auch sehr schnell laufen.
select s.id, s.name, f.id, f.name
from Sportwagen_Fahrer_rel r,
Sportwagen s,
Fahrer f
where r.idSportwagen = s.id
and r.idFahrer = r.id
reichen
Haeh? Kapier ich nicht. Abgesehen davon, dass es wohl f.id in der letzten Zeile heissen soll. Kapier ich trotzdem nicht. Ich hab das:
mysql\> select \* from Fahrer; select \* from Sportwagen; select \* from Sportwagen\_Fahrer\_rel;
+----+---------+
| id | name |
+----+---------+
| 2 | Horst |
| 1 | Klaus |
| 3 | Michael |
| 4 | Peter |
+----+---------+
4 rows in set (0.00 sec)
+----+-------------+
| id | name |
+----+-------------+
| 1 | Audi |
| 3 | Ferrari |
| 4 | Lamborghini |
| 2 | Porsche |
+----+-------------+
4 rows in set (0.00 sec)
+----+--------------+----------+
| id | idSportwagen | idFahrer |
+----+--------------+----------+
| 8 | 1 | 4 |
| 7 | 2 | 1 |
| 10 | 2 | 2 |
| 9 | 2 | 3 |
| 5 | 2 | 4 |
| 6 | 3 | 3 |
+----+--------------+----------+
6 rows in set (0.00 sec)
Deine Abfrage gibt:
mysql\> select s.id, s.name, f.id, f.name
-\> from Sportwagen\_Fahrer\_rel r,
-\> Sportwagen s,
-\> Fahrer f
-\> where r.idSportwagen = s.id
-\> and r.idFahrer = f.id;
+----+---------+----+---------+
| id | name | id | name |
+----+---------+----+---------+
| 1 | Audi | 4 | Peter |
| 3 | Ferrari | 3 | Michael |
| 2 | Porsche | 1 | Klaus |
| 2 | Porsche | 2 | Horst |
| 2 | Porsche | 3 | Michael |
| 2 | Porsche | 4 | Peter |
+----+---------+----+---------+
6 rows in set (0.00 sec)
mysql\>
Ich will aber eher sowas:
Audi Porsche Ferrari Lamborghini
Klaus 1
Horst 1
Michael 1 1
Peter 1 1
Ich sehe jetzt irgendwie nicht, wie ich mit Deiner Abfrage diese Informationen kriege. Hm, naja, irgendwie vielleicht schon. Ich glaube… ich such mal noch nach dem Knoten in meinem Gehirn.
das liegt daran, das SQL nicht dazu ausgelegt ist, eine Matrix aufzubauen (und schon garnicht in den von Dir genannten Zahlen), aber warum hat man sein Ausgabeprogramm? SQL liefert Dir nur die Koordinaten, bei dem Du bzw. Dein Ausgabeprogramm ein Kreuz machen sollst.
MfG Georg V.
P.S.: Bei einer kleiner Anzahl kann man mit SQL etwas tricksen, suche mal im Archiv, eventuell hilft das Stichwort transponieren.