Datensätze ändern und neu sortieren

killefid rai

Grünschnabel
Hallo zusammen,
ich bin Rainer und habe folgendes Problem:

Ich habe für einen Shop eine Art Master/Slave Artikelsystem gebaut. Wenn ein Artikel aufgerufen wird, der in der Produkttabelle eine Master_id aufweist, sucht eine Funktion den entsprechenden Namen des Masterartikel raus und zeigt ihn mit an. Ein Beispiel ist hier zu sehen. Das ganze funktioniert auch soweit fehlerfrei.
Nun möchte ich eine alphabetisch sortierte Liste erstellen in der meine Slaveartikel mit vorgestelltem Namen des Masterartikels angezeigt werden. Der Artikel soll nun aber alphabetisch zum Masternamen sortiert werden und nicht zum Slavenamen. Meine Funktion schafft es lediglich einen Masternamen rauszusuchen und vor den Slavenamen zu setzten. Kann aber ja nicht so sinnvoll sein für jeden Artikel die Funktion neu laufen zu lassen.
Hat jemand eine Idee, wie ich in einer query meine Artikel incl zugehörigem Masternamen sortiert abrufen kann? Master und Slave Artikel liegen in der selben Tabelle. Die SOL Version ist 4.0.17 und sollte notfalls auch subselect können. (im Gegensatz zu mir...)

Rainer
 
Das Problem ist, daß Master und Slave Artikel sich nur darin unterscheiden, daß beim Slaveartikel die ID des zugehörigen Masterartikels mit angegeben ist. Ich brauche also z.B. sowas wie

SELECT products_name, products_price, master_id FROM products WHERE products_id = 123 ORDER BY products_name

und zusätzlich eine Funktion die ich aufrufe wenn master_id <> '0'

SELECT products_name, FROM products WHERE products_id = master_id (master_id stammt natürlich aus der query davor)

Ich würde es ja vielleicht noch mit JOIN hinkriegen, wenn Master und Slave in unterschiedlichen Tabellen wären, aber geht das auch in einer?

@Lumpi02

wenn ich denn code hätte... Was bisher funktioniert sind nur standard select Querys wie z.B. oben. In Wirklichkeit sind die noch etwas ausführlicher, aber es geht mir eher um die grundsätzliche Logic mit der man sowas anfangen könnte.

Zum Verständnis eine Beispieltabelle:

products_id | products_name | products_price | master_id
123 | Masterprodukt | - | -
124 | Slaveprodukt 1 | 12,00 | 123
125 | Slaveprodukt 2 | 42,00 | 123
126 | Standardprod | 8,00 | -

auflisten möchte ich die Artikel dann wie folgt:

Masterprodukt Slaveprodukt 1 | 12,00
Masterprodukt Slaveprodukt 2 | 42,00
Standardprod | 8,00

alphabetisch sortiert so als ob Master und Slavename nun ein wären.

Rainer
 
Also wenn ich dich jetzt recht verstehe, versuchst du, die Artikel in Kategorien zu gliedern?

Ich habe das mit einer 2ten Tabelle gelöst, da kann ich die Kategorien sogar noch mal in Rubriken einteilen.
rubrik_id | rubrik | Kategorie

legt man nun eine neue Kategorie an, muß man im nächsten Screen eine Rubrik erstellen und bekommt eine rubrik_id auto_increment

Alle Artikel sind in einer 2ten Tabelle und haben auch das Feld der rubrik_id (anderer Name, wegen Verwechslungen) und können so zugeordnet werden.

Der Vorteil hier ist, das alles frei erweiterbar ist und das sogar vom Anwender, ohne das du nochmal dran mußt.

Wenn du einen Shop erstellst, würde ich dir das in der Form ans Herz legen. Später sind sogar noch "Oberkategorien" umsetzbar, ohne das gesamte Konzept über´n Haufen werfen zu müssen.

Der Link in meiner Sig hat das Ergebnis drin.

btw: hübsches Design hast du da
 
Eigendlich ging es mr darum Artikeloptionen besser verwalten zu können. Wenn eine Hose z.B. in rot und blau vorhanden ist, ist der Artikel mit dem ich arbeite in Wirklichkeit nicht "Hose" sondern "blau". "blau" ist ein gewöhnlicher Artikel und hat eine eigene ID, eigenen Lagerort, Lagerbestand, Statistik, Preis, etc. Nur weil man mit "blau" alleine nichts anfangen kann, wenn man eine "Hose" kaufen will muß "Hose" mitangezeigt werden. Im Shop funktioniert das auch alles prima. Es werden ja immer nur wenige Artikel gleichzeitig angezeigt. Deshalb ist es nicht so schlimm zum Ermitteln des Masternamens immer eine einzelne Abfrage zu machen. Nur bei der kompletten Übersichtsliste klappt das halt nicht.

Der komplette Shop steht und funktioniert soweit. Da will ich nichts mehr ändern.

Ich dachte daran das Ergebnis der Abfrage (jeder Datensatz ist ja ein eigenes Array) in ein weiteres Array zu packen und dann neu zu sortieren. Nur muß ich dann bei 1000 Artikeln auch 1000 Abfragen machen....

Sollte doch auch anders gehen, oder?
 
vielleicht gehts so:

PHP:
   $sql = "select
   prdoucts_name,
   products_price
   from
   products s1
   where master_id = (select products_name from products s2 where s1.master_id = s2.products_id);

edit: Andernfalls solltest du dir überlegen, ob du nicht für die Abfrage eine TEMPORARY table erstellen solltest, wo du dann einen Join benutzen kannst :)
 
Hallo,

so, ich habe jetzt viel, viel rumprobiert und bin schon ganz nah dran.

PHP:
  $products_query_raw = 
"select concat_ws(if(pd2.products_name, pd2.products_name, ''), pd2.products_name, ' ',         pd1.products_name) as name, 
       pd1.products_id, 
       p.products_price, 
       p.products_tax_class_id, 
       p.products_status 
from " . TABLE_PRODUCTS_DESCRIPTION . " pd1,
 " . TABLE_PRODUCTS . " p 
LEFT OUTER JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd2 
ON (pd2.products_id = p.master_id) 
where (p.products_id = pd1.products_id and pd1.language_id = '" . $languages_id . "') 
and p.products_status = '1' 
and ((pd1.products_name like '%" . $HTTP_GET_VARS['search'] . "%') OR (pd2.products_name like '%" . $HTTP_GET_VARS['search'] . "%')) 
order by name ASC";

Meine Slaveartikel zeigen jetzt den Masterartikel mit an. Master- und Slavename stehen sogar in einer Variable, was mir die Arbeit nachher ein wenig einfacher macht.

NUR: Ich bekomme es nicht sauber alphabetisch sortiert. Die Artikel denen ich den Masternamen vorangestellt habe werden immer hintenan gestellt.

Hätte da nochmal jemand eine Idee wie ich das umgehen kann?

Rainer
 
Zurück