Mysql-abfragen zusammenfassen

Also ich möchte aus der Daten bank die 4 aktuellsten Datensätze verschiedener Kategorien abfragen.
Man kann sich das etwa wie ein Shop vorstellen ein Kunde kauft viele Dinge und aus jeder Kategorie soll der letzte gekaufte Gegenstand abgefragt werden.
Ich gehe mal von 4 Kategorien aus man könnte jetzt abfragen:
Code:
SELECT * FROM tabelle WHERE kategorie = 1 ORDER BY id LIMIT 1
Nun könnte man das auch für die anderen Abfragen (z.B.: kategorie = 2 dann 3 dann 4)machen, will ich aber nicht ich möchte das gerne in einer machen.
Da hatte ich mir gedacht:
Code:
 SELECT * FROM tabelle WHERE userid = 1
Nun hätte ich aber alle gekauften Artikel ,es wäre zwar möglich das im nachinein noch zu ordnen aber ich möchte das gerne in der Abfrage machen.
Hoffe das ist überhaupt möglich.

Wer weiß Rat?
 
Hi

meiner Meinung geht das am einfachsten, wenn Du ein Subselect auf die gleiche Tabelle machst und die max(id) gruppiert nach Kategorien ausliest. Aber subselects werden erst ab mysql 4.1 unterstützt.

bsp.

SELECT * from tabelle where id in (select max(id) from tabelle where userid = 1 group by kategorie)
 
Für das was Du willst, muss man (ohne Subselects und Unions) ziemlich fies tricksen:
Du musst den SELECT auf eine User-ID beschränken und nach Kategorie gruppieren, so bekommst Du für jede Kategorie einen Datensatz.

Dummerweise hast Du keine Kontrolle darüber, welchen Datensatz. Du kannst aber die MAX()-Aggregatfunktion dazu benutzen, Dir den Inhalt eines bestimmten Feldes (B) desjenigen Datensatzes zu holen, bei dem ein anderes Feld (A) den höchsten Wert in der Gruppe hat. Dazu musst Du den Inhalt von Feld A und B verketten (CONCAT), davon den MAX-Wert ermitteln und dann den Inhalt von A wieder wegpfriemeln:
Code:
SELECT
  kategorie,
  SUBSTRING(MAX(CONCAT(LPAD(id, 11, '0'), artikel)), 12) AS letzterartikel
FROM
  tabelle
WHERE
  userid = '1'
GROUP BY
  kategorie
Viele Grüße,
Martin
(ehemals "Resalb")
 
Zuletzt bearbeitet:
Also ich habe zwar keine Ahnung was du mir damit sagen willst aber werde es zu na humaneren Zeit ausprobieren, aber schonmal danke für die Antwort.
 
Gut das funktioniert auch soweit gut, aber das dumme ist ich habe nur den Artikelnamen möchte aber alle daten.
Ich habe zwar in der mysql reference etwas gefunden kriege es aber nicht wirklich zum laufen, und die Lösung gefällt mir nicht wirklich da ich 4 mal ManicMarble Lösung machen müsste, da könnte ich gleich 4 Anfragen senden speed kommt ziemlich auf das Gleiche raus.
 
Hi

aber Du könntest diesen Part doch noch erweitern z.B. für Deine anderen Felder? Einfach mal ausprobieren.

SUBSTRING(MAX(CONCAT(LPAD(id, 11, '0'), artikel)), 12) AS letzterartikel

Wenn es nicht (bei mir tuts das) dann kannst Du immer noch eine Abfrage auf

select max(id) as maxid from tabelle group by kat

stellen, Dir die entspr. ids in einen Array laden und im Script über den in-Operator die gleiche Tabelle mit diesen Werten filtern. Das entspricht ungefähr meiner zuerst geposteten Lösung.
 
SUBSTRING(MAX(CONCAT(LPAD(id, 11, '0'), artikel)), 12) AS letzterartikel

Wie kann ich das erweitern hab zwar schon probiert hat aber nicht funktioniert.
Deine 2. Lösung ignoriert vollkommen den User da könnte ich auch alles von den User laden, es geht ja drum nur die richtigen Daten zu laden klar könnte ich das in nen array sortieren aber , da frag ich zuviele unötige Daten ab.
 
SUBSTRING(MAX(CONCAT(LPAD(id, 11, '0'), artikel)), 12) AS letzterartikel,
SUBSTRING(MAX(CONCAT(LPAD(id, 11, '0'), anderesfeld)), 12) AS letztesanderesfeld ...

Wegen dem User, Du kannst doch doch die 1. Abfrage auf diese Bedingung filtern

select max(id) as neuid from tabelle where user = 1 group by kategorie

Ich habe das jetzt nicht erwähnt, ich dachte, das wäre klar. :)

Dann liest Du Dir die IDs in einen Array mit Ausgabe (1,3,5,7)..

Filterung des 2. Statements auf

select * from tabelle where id in ($array)

Dies sind jetzt Beispielname von mir z.b. für php.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück