Rolf B: mysql - 2 Queries oder doch eine?

Beitrag lesen

Hallo Jörg,

ich dachte an Vorgänge. Aber da bin ich dann wohl mit deiner Doppelbelegung des Begriffs für table2 und table4 durcheinander gekommen.

Den Warenkorb selbst wirst Du aber auch brauchen, oder?

Also

-- Allg. Daten zum Warenkorb einlesen
SELECT w.mid, w.foo, w.bar, w.baz 
FROM   table4 w 
WHERE  w.mid = 4780

-- Artikel im Warenkorb holen
SELECT s.anzahl, s.dings, s.bums, a.id, a.name, a.del, foo, bar, baz 
FROM   table3 s JOIN artikel a ON s.id = a.id 
WHERE  s.mid = 4780

An dieser Stelle solltest Du die Artikelliste übernehmen und die Artikel-IDs zu einer kommaseparierten Liste machen

SELECT dg.id, dg.bla, dg.blub, dg.hui
FROM   table2 dg
WHERE  dg.id IN ($artikelliste)

$artikelliste in den SQL String zu setzen wäre PHP - ich weiß nicht welche Sprache Du verwendest. Maskieren ist hier nicht erforderlich, wenn die aus der Artikeltabelle gelesenen IDs numerisch sind. An welchen Stellen Du noch auf das del Kennzeichen abfragen musst, ist mir nicht so klar.

Eine IN Klausel hat den Nachteil, dass man die Werte darin nicht per Prepare einsteuern kann. Also jedenfalls nicht als Array, man müsste für jeden Wert einen eigenen Parametermarker verwenden und das ist Quatsch, wenn die Anzahl variabel ist. Die Alternative zum dynamisch aufgebauten SQL String wäre eine Subquery, die die Artikel-IDs liefert. Dafür reicht table3. Das sollte fix genug sein, denn die Daten sollten dann noch im Cache liegen. Ob es für Dich schnell genug ist, musst Du testen. Die reine SQL Performance ist nicht allein entscheidend, denn die Host-Programmiersprache muss ja im anderen Fall auch den Id-String aufbauen und das SQL Statement muss neu geparsed werden.

SELECT dg.id, dg.bla, dg.blub, dg.hui
FROM   table2 dg
WHERE  dg.id IN (SELECT s.id
                 FROM   table3 s
                 WHERE s.mid = 4780)

Rolf

--
sumpsi - posui - obstruxi