Vorgegebene Liste an IDs in Mysql ausgeben

Ronald Nickel

Legendäres Mitglied
Hallo an alle Ayomies

ich bräuchte nochtmal SQL Support

SELECT * FROM artikel
where artikel_id IN ('1','2.'3,'123,'234','3')

...klappt ja eigentlich so wie ich es will. Allerdings gibt die Abfrage die ID "3" nur einmal aus und somit aucgh nur 5 Datensätze
Wie muss das Statement aussehen, dass sie alle 6 Results ausgibt,- auch die die öfter in der Liste stehen? Es soll die '3' also 2x als Resultat ausgegeben werden (an 3. und 6. Stelle).

Gruß Ronny
 
Hmm, einzige Idee die ich da hätte wäre das du die ids in einem Array speicherst und die SQL-Abfrage dann einzeln für jede id machst.

Denkanstoß:
while ($pos) {
SELECT * FROM artikel where artikel_id IN ($array[$pos])
...
}
 
Die Frage ist doch vielmehr:
Warum willst du das machen?

Ist die artikel_id Primärschlüssel der Datenbank?
Dann kannst du das mit normalen mitteln nicht hinbekommen (evtl könntest du es mit einem Join schaffen).

Also ohne mehr Wissen übe rdie Struktur der Datenbank und wozu du dies möchtest ist es schwer Dir zu helfen.
 
okay: Hintergrund ist folgender

Angewählte Artikel-IDs beim hinzufügen eines Artikels in den Wraenkorb in eine Session-Variable in form einer Liste gespeichert, die nach ein paar Einkäufen ungefär so aussieht:

'1','45','156','67','7965','46','678','3454','676','68,123','4',56','67,'37','1'

Um den Warenkorb zu zeigen will ich jetz nach und nach die einzelnen ID via SQL abfragen und die entsprechenden Datensätze der Artikel darstellen. Thats it! Und da der Kunde einen Artikel ja auch 2x auswählen kann muss der Artikel auch 2x angezeigt werden.

Gruß Ronny
 
Kann es sein dass es einfach nur ein Tipfehler ist?

CODE ('1','2','3','123','234','3')

statt

CODE ('1','2.'3,'123,'234','3')
 
Ich würde mit einem ganz anderem Ansatz an die Sache gehen:

Die Daten für jede ArtikelID nur einmal auslesen.

Dann seperat durchzählen wie oft eine Artikelnummer zwischen den Klammern vorkommt und das dann als Bestellmenge zu den ausgelesenen Datensätzen schreiben.
 
Der 'IN' - Operator ist ein Operator, der auf Mengen arbeitet. Und wenn man in einer Mengenaufzählung ein Element wiederholt, dann kann man es auch streichen. Sprich: Mit 'IN (...)' darf das nicht funktionieren.

Allerdings ist der Ansatz zunächst zu einfach und wird deshalb unnötig kompliziert: Ich würde entweder zwei Arrays oder einen Array mit zwei Spalten (weiß nicht, was da unterstützt wird) verwenden - eine Spalte für die ID, eine für die Zahl der bestellten Artikel.

Sucht sich der Nutzer einen Artikel aus, dann überprüfe, ob die ID schon gewählt ist. Falls nein, füge so etwas wie (ID, 1) hinzu, falls ja, erhöhe die hintere Position um 1.
 
Ich wundere mich das SQL hierfür wohl keinen Königweg bereitstellt.

Ich habe es nun anders gelöst.
Ich habe ein Loop über die Warenkorbliste gelegt und bei jedem Durchgang eine Query gestartet, die die Artikel-Id entsprechend des Loop indexes abfragt. Das ist zwar Steinzeitperformance aber es geht. Sollte sich widererwarten eine performantere/sql-basierte Lösung aufzeigen bin ich weiterhin für jeden Lösungsweg dankbar.

Danke an Alle

Gruß Ronny
 
Ganz ehrlich?
Ich finde das ist von den genannten Lösungswegen der Schlechteste.

Nicht nur das das Performancebezogen ein echter Killer ist, für den User ist es auch die unübersichtlichste Variante da er jetzt nicht auf einen Blick sieht wie oft er einen Artikel bestellt hat sondern sich das aus der kompletten Liste zusammen suchen muss.

Ich denke da passiert es leicht mal das man übersieht das man einen Artikel unten in der Liste oben ja schonmal ausgewählt hatte.
Zumindest wenn man viele Artikel in seinen Warenkorb packt.
 
so als idee zur inspiration:
CODE
begin;

create table artikel_temp (id int);

insert into artikel_temp (id)
values (1),(2),(3),(123),(234),(3);

select * from artikel, artikel_temp
where artikel.id = artikel_temp.id
order by artikel.id;

drop table artikel_temp;

commit;

 
@TSc
nicht dass es mich in tiefe Depressionen stürzen würde, aber du hast recht.

Ich werde voraussichtlich eine Kompromislösung anstreben, die die List einmal durch-looped dann aber die Anzahl der einzelnen Artikel ausgibt und dies auch mit dem Einzelpreis multipliziert.

Trotzdem Allen erst mal vielen Dank!

Gruß Ronny
 
Zurück
Oben