Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

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

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
blinks
PostRank 4
PostRank 4
Beiträge: 155
Registriert: 25.01.2004, 12:37

Beitrag von blinks » 21.03.2006, 09:10

...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

Anzeige von ABAKUS

von Anzeige von ABAKUS »


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

marc75
PostRank 9
PostRank 9
Beiträge: 1916
Registriert: 06.10.2004, 09:36

Beitrag von marc75 » 21.03.2006, 09:17

suche mal nach subselect + mysql, habe aber keine Ahnung ab welcher Version subselects funktionieren.

blinks
PostRank 4
PostRank 4
Beiträge: 155
Registriert: 25.01.2004, 12:37

Beitrag von blinks » 21.03.2006, 09:20

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 :(

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


fornex
PostRank 4
PostRank 4
Beiträge: 154
Registriert: 01.03.2006, 01:14
Wohnort: :tronhoW

Beitrag von fornex » 21.03.2006, 10:23

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).
Suche Linkpartner für Bereiche:
Flirt - Fun - Erotik - 1 Click Hoster

ICQ: 7o7727

Googlebot versteht Javascript

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 21.03.2006, 11:21

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

blinks
PostRank 4
PostRank 4
Beiträge: 155
Registriert: 25.01.2004, 12:37

Beitrag von blinks » 21.03.2006, 11:46

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

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 21.03.2006, 13:07

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...).

marc75
PostRank 9
PostRank 9
Beiträge: 1916
Registriert: 06.10.2004, 09:36

Beitrag von marc75 » 21.03.2006, 13:22

Eine Möglichkeit wäre auch, zwei einzelne Selects zu machen und das array in der while schleife neu zusammenzubauen.

fornex
PostRank 4
PostRank 4
Beiträge: 154
Registriert: 01.03.2006, 01:14
Wohnort: :tronhoW

Beitrag von fornex » 21.03.2006, 14:26

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.
Suche Linkpartner für Bereiche:
Flirt - Fun - Erotik - 1 Click Hoster

ICQ: 7o7727

Googlebot versteht Javascript

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag