MySQL: n m als Matrix

Hi,

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:

Sportwagen:
+----+-------------+
| id | name |
+----+-------------+
| 1 | Audi |
| 2 | Porsche |
| 3 | Ferrari |
| 4 | Lamborghini |
+----+-------------+

Fahrer:
+----+---------+
| id | name |
+----+---------+
| 1 | Klaus |
| 2 | Horst |
| 3 | Michael |
| 4 | Peter |
+----+---------+

Sportwagen\_Fahrer\_rel:
+-----+--------------+----------+
| id | idSportwagen | idFahrer |
+-----+--------------+----------+
| 18 | 2 | 4 |
| 216 | 3 | 3 |
| 217 | 2 | 1 |
| 497 | 1 | 4 |
| 299 | 2 | 3 |
| 218 | 2 | 2 |
+-----+--------------+----------+

Ich glaube, das macht man 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?

Danke im Voraus.

Mf
Gruss vom Frank.

Hallo Frank,

statt

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.

Oder habe ich da irgendwas übersehen?

MfG Georg V.

Hi,

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

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.

Danke,
Gruss vom Frank.

Hallo Frank,

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.