Ich habe die folgenden fünf Tabellen:
Code: Alles auswählen
|--------------------------------------|
| autos |
|--------------------------------------|
| id | name | ps | max_speed | allrad |
|--------------------------------------|
| 1 | karre | 40 | 120 | 0 |
| 2 | kiste | 60 | 150 | 0 |
| 3 | gurke | 90 | 180 | 1 |
|--------------------------------------|
|-------------------|
| kategorien |
|-------------------|
| id | kategorie |
|-------------------|
| 1 | geländewagen |
| 2 | familienauto |
|-------------------|
|------------|
| farben |
|------------|
| id | farbe |
|------------|
| 1 | rot |
| 2 | gelb |
| 3 | blau |
|------------|
|------------------------|
| _rel_kategorien_autos |
|------------------------|
| auto_id | kategorie_id |
|------------------------|
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 3 | 1 |
| 3 | 2 |
|------------------------|
|--------------------|
| _rel_farben_autos |
|--------------------|
| auto_id | farbe_id |
|--------------------|
| 1 | 1 |
| 1 | 3 |
| 2 | 1 |
| 3 | 2 |
| 3 | 3 |
|--------------------|
die tabellen kategorien und farben können jederzeit um weitere werte ergänzt werden,
daher habe ich zwei tabellen mit den relationen zwischen autos und kategorien/farben angelegt.
soweit die vorgegeschichte. wichtig ist noch: ich verwende smarty als tpl-engine.
so, nun möchte ich eine liste der autos ausgeben lassen, die wie folgt ausschaut:
Code: Alles auswählen
auto | ps | maximale geschw. | allradantrieb? | farben
------------------------------------------------------------
karre | 40 | 120 km/h | nein | rot, blau
kiste | 60 | 150 km/h | nein | rot
gurke | 90 | 180 km/h | ja | gelb, blau
meine querrys sehen wie folgt aus:
Code: Alles auswählen
$sql="SELECT autos.*
FROM autos
LEFT JOIN _rel_kategorien_autos ON autos.id=_rel_kategorien_autos.auto_id
WHERE _rel_kategorien_autos.kategorie_id=".$core->current_body." ORDER BY autos DESC";
$dump=$db->query($sql);
if (PEAR::isError($dump)) die($dump->getMessage());
while ($data=$dump->fetchRow(DB_FETCHMODE_ASSOC)) {
$autos[] = $data;
}
So, nun habe ich ein Array $autos, in dem sämtliche Autos einer Kategorie mit all ihren Eigenschaften, ausser
der Farben... Da pro Auto mehrere Farben möglich sind, sollten die Farben wieder in einem Array gespeichert werden.
Eine Frage zwischendurch: ISt es möglich, ein SELECT so zu gestalten, dass ein Array mit folgender Struktur herauskommt?
Code: Alles auswählen
Array
(
[0] => Array
(
[id] => 1
[name] => karre
[ps] => 40
[max_speed] => 120
[allrad] => 0
[farben] => Array
{
[0] => 1
[1] => 3
}
)
)
Denn wenn ich das mittels
Code: Alles auswählen
$sql="SELECT autos.*,
(SELECT farbe_id FROM _rel_farben_autos WHERE auto_id=autos.id) AS farben
FROM autos
LEFT JOIN _rel_kategorien_autos ON autos.id=_rel_kategorien_autos.auto_id
WHERE _rel_kategorien_autos.kategorie_id=".$core->current_body." ORDER BY autos DESC";
versuche, erhalte ich folgende Fehlermeldung: #1242 - Subquery returns more than 1 row
Muss ich tatsächlich, für jeden erhaltenen Datensatz der Tabelle 'autos' einen weiteren Querry
starten, welcher zur jeweiligen auto_id die gültigen farbid's holt? denn dann bekomme ich evtl.
Probleme mit der Verarbeitung mittels Smarty, denn ich muss entweder eine unbestimmte Anzahl von
Arrays assignen (fortlaufend numeriert, was mit Smarty so nicht geht wie ich erfahren habe),
oder, wenn ich alles in ein Array packe, muss ich zuviel Logik in die Templates implementieren...
Ich hoffe, dass ich mein Problem einigermassen verständlich rübergebracht habe...
Für jeden hilfreichen Tipp wäre ich sehr dankbar!
Gruß,
blinks