Seite 1 von 1

select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 09:10
von blinks
...um keine Zeit zu verlieren, komm ich direkt mal zu meinem Problemchen.

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

Verfasst:
von

Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 09:17
von marc75
suche mal nach subselect + mysql, habe aber keine Ahnung ab welcher Version subselects funktionieren.

select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 09:20
von blinks
ich habs ja schon mit nem subselect probiert... funktioniert aber leider nicht so wie ich es gerne hätte: #1242 - Subquery returns more than 1 row :(

Verfasst:
von

select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 10:23
von fornex
Hi,

Code: Alles auswählen

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => karre
            [ps] => 40
            [max_speed] => 120
            [allrad] => 0
            [farben] => Array
               {
                  [0] => 1
                  [1] => 3
               }
        )

)
Das wird nie im Leben funktionieren. Du musst die Farben mittels JOIN rausholen und dann bei mysql_fetch_array einen multidimensionalen Array erzeugen. Oder du verzichtest auf die Normalität der DB und machst bei "autos" ein zusätzliches Feld "farben" (1,2,3 oder rot, grün, gelb).

select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 11:21
von sean
bei der angegebenen Tabellenstruktur kannst Du sogar einen einzelnen Select auf die Farben machen. Das dürfte aus Performance-Sicht nicht viel ausmachen.

Gruß

sean

Re: select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 11:46
von blinks
fornex hat geschrieben:Oder du verzichtest auf die Normalität der DB und machst bei "autos" ein zusätzliches Feld "farben" (1,2,3 oder rot, grün, gelb).
eben das möchte ich wegen der flexibilität und der späteren erweiterungsmöglichkeiten nicht machen, denn ich will nicht für jede neue farbe in der db-struktur rumfuchteln und die querrys im php-code ändern...
sean hat geschrieben:bei der angegebenen Tabellenstruktur kannst Du sogar einen einzelnen Select auf die Farben machen. Das dürfte aus Performance-Sicht nicht viel ausmachen.
ja, das ist klar, aber das gibt dann bei der weiterverarbeitung mit smarty komplikationen. also es geht generell schon, aber ich möchte eine möglichst 'saubere', schnelle und ressourcen-sparende lösung... aber vermutlich muss ich es tatsächlich so machen...

danke schonmal an euch! solle noch jemandem was nettes einfallen würde ich mich natürlich freuen ;)

gruß,
blinks

select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 13:07
von sean
fornex hat folgendes geschrieben::
Oder du verzichtest auf die Normalität der DB und machst bei "autos" ein zusätzliches Feld "farben" (1,2,3 oder rot, grün, gelb).

eben das möchte ich wegen der flexibilität und der späteren erweiterungsmöglichkeiten nicht machen,
die Flexibilität geht dabei ja nicht verloren, Du kannst immer noch weitere Farben zufügen (in der Farbreferenztabelle). Nenn das Feld in der Stammtabelle z.B. ref_Farbe und schreib dort die FarbID(s) rein.
a, das ist klar, aber das gibt dann bei der weiterverarbeitung mit smarty komplikationen. also es geht generell schon, aber ich möchte eine möglichst 'saubere', schnelle und ressourcen-sparende lösung
Dann musst Du dir selbst ein mehrdimensionales Array machen, wenn smarty damit zurechkommt.

Ich habe früher immer alles mit Relationen erstellt, aber bei vielen Projekten heute schreibe ich die FarbID direkt mit in die Stammtabelle. Wenn Du nicht gerade 50000 Autos mt 5 MIO Optionen einpflegen willst, reicht das alle Male! Dein Ansatz sieht mir sehr "objektrelational" aus, so aus Programmierersicht :-) Wenn das kein großes Projekt ist, würd ich mir sogar - wie gesagt - die relation sparen und nur den Feldbezeichner darüber ausgeben (1 = schwarz, 2 = silber, usw...).

select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 13:22
von marc75
Eine Möglichkeit wäre auch, zwei einzelne Selects zu machen und das array in der while schleife neu zusammenzubauen.

Re: select, subselect, arrays in result und smarty...

Verfasst: 21.03.2006, 14:26
von fornex
sean hat geschrieben:Wenn das kein großes Projekt ist, würd ich mir sogar - wie gesagt - die relation sparen und nur den Feldbezeichner darüber ausgeben (1 = schwarz, 2 = silber, usw...).
Auch wenn es ein größeres Projekt wäre, würde ich selber an dieser Stelle die Redundanz bevorzugen, um auf ein zusätzliches "SELECT" zu verzichten.
Aber, wie gasagt, das muss jeder seinen Bedürfnissen nach anpassen.