Es gibt die Tabelle User (Benutzer), die Tabelle Items (Artikel) und sie werden über die Tabelle Sales (Einkäufe) miteinander verknüpft, sobald der Benutzer einen Artikel kauft. index.php?page=Attachment&attachmentID=489
Gruppieren wir die erste Abfrage nach der userid erhalten wir alle Benutzer mit dem Artikel und dem Datum des ersten Einkaufs bzw der natürlichen Reihenfolge, die sich durch das Einfügen in die Tabelle erschließt.
Da diese natürliche Reihenfolge durch den Befehl OPTIMIZE TABLE wieder durcheinander gebracht wird, kann man aber eigentlich nur von einem beliebigem Einkauf reden, der angezeigt wird.
Wollen wir statt dem ersten Einkauf den letzten erhalten, dann müssen wir die natürliche Reihenfolge, nach der MySQL gruppiert umdrehen, indem wir die Abfrage in einem Subselect absteigend nach der Zeit sortieren.
SQL Code
1
2
3
SELECT userid,itemid,date FROM(SELECT * FROM sales ORDERBY date DESC) sales WHERE userid IN(1,3,5);
Um nun überhaupt an zwei Artikel zu gelangen, könnte man die letzten beiden Abfragen per UNION verbinden. Doch wir wollen die beiden letzten.
Dazu bedienen wir uns zweier MySQL Variablen. @x und @userid_tmp.
@x ist eine Zählervariable. Sie nummeriert alle gekauften Items eines Benutzers durch. Sobald @userid_tmp nicht mehr der aktuellen userid ist, dann wird der Zähler zurück gesetzt und die Nummerierung beginnt beim nächsten Benutzer.
Wenn wir die letzten beiden Käufe erhalten wollen, brauchen wir In der WHERE Bedingung nur noch auf die Käufe mit den Zahlen 1 und 2 einzuschränken.
SQL Code
1
2
3
4
5
6
7
8
9
10
11
SET @x = 0;
SET @userid_tmp = 0;
SELECT userid,itemid,date FROM(SELECT userid,itemid,date,
@x := IF(@userid_tmp = userid, @x+1, 0)AS c,
@userid_tmp := userid AS d
FROM`sales`WHERE userid IN(1,3,5,6,10,12)ORDERBY userid ASC,date DESC) sub
WHERE c < 2;