SQL - Mehrfacheinträge nach Häufigkeit ausgeben

grünes-huhn

Mitglied
Hi,

ich hätte da mal eine Tabelle, gefüllt mit Produkten.

Nun möchte ich quasi die meistgekauften auslesen.

So sieht die Tabelle in etwa aus:

id Produktname
1 Holla
2 Holla
3 Servus
4 Tach
5 Tach
6 Tach

Ergebnis hätt ich gerne folgendes:

Tach
Holla
Servus

eben auch sortiert nach letzten Eintrag, also Id (zb wenn ich Limit 4 hätte: Tach und Servus)

im Moment hätt ich das hier:
SELECT * FROM orderedprod GROUP by name HAVING COUNT(name)>2 ORDER by oprod_orderid DESC LIMIT 30

Das ist natürlich irgendwie Blödsinn.....

Danke schön mal für eure Gedanken :)
 
Hi,

spontan würde ich sagen:

SQL:
select name, count(id) as c 
   from tabelle
   group by name
   order by c desc

Allerdings:



Hä? Die Logik verstehe ich nicht...
Entweder willst Du die 4 meistgekauften oder die 4 zuletzt gekauften Produkte...

LG

Naja ich würde gerne die meistverkauften Produkte der letzten 2 Monate ausgeben, damit sie immer aktuell sind.


soweit, dass ich die meistverkauften Produkte ausgebe, bin ich schon. Nur wenn ich es sortiere, gehts entweder nach Produkten oder nach ID.
Das hab ich jetzt:

SELECT *, COUNT(name) as hugo FROM orderedprod GROUP by name ORDER by hugo DESC LIMIT 9;

Muss ich da mit zwei abfragen arbeiten? Das wollte ich mir eigentlich ersparen!
Also ich müsste das tun: "ORDER by id, hugo" nur geht das so nicht ganz.
 
Naja ich würde gerne die meistverkauften Produkte der letzten 2 Monate ausgeben, damit sie immer aktuell sind.
.

Es gibt dann demnach eine Datumspalte in der Tabelle?

SQL:
SELECT name, COUNT(id) AS c
FROM tabelle
GROUP BY name HAVING datum > TO_DATE(vor_zwei_monaten)
ORDER BY c DESC
du kannst natürlich zusätzlich noch nach z.B.: dem Datum des letzen Verkaufs ordnen mit
SQL:
ORDER BY c DESC, MAX(datum)
 
Zuletzt bearbeitet von einem Moderator:
Es gibt dann demnach eine Datumspalte in der Tabelle?

SQL:
SELECT name, COUNT(id) AS c
FROM tabelle
GROUP BY name HAVING datum > TO_DATE(vor_zwei_monaten)
ORDER BY c DESC
du kannst natürlich zusätzlich noch nach z.B.: dem Datum des letzen Verkaufs ordnen mit
SQL:
ORDER BY c DESC, MAX(datum)


nein ich mach es nach ID. Die zwei Monate waren nur ein Beispiel. etwa ID Limit 50 oder sowas, aber eben nach ID sortiert DESC
 
Zuletzt bearbeitet von einem Moderator:
Du willst die z.B.: 50 letzten Einträge in der Tabelle? und deine IDs sind autowerte?

SQL:
SELECT name, COUNT(id) as c FROM
   (SELECT name, id FROM tabelle ORDER BY id LIMIT 50)
   GROUP BY name
   ORDER BY c DESC

ev. musst du noch bei ORDER BY id ein DESC dahinter schreiben, ich hab grad keine DB zum probieren
 
Zuletzt bearbeitet von einem Moderator:
Du willst die z.B.: 50 letzten Einträge in der Tabelle? und deine IDs sind autowerte?

SQL:
SELECT name, COUNT(id) as c FROM
   (SELECT name, id FROM tabelle ORDER BY id LIMIT 50)
   GROUP BY name
   ORDER BY c DESC

ev. musst du noch bei ORDER BY id ein DESC dahinter schreiben, ich hab grad keine DB zum probieren

ich habs jetzt noch nicht getestet, aber so les ich nur die letzten 50 Einträge aus und nicht die mit den meisten Produkten.

Ich brauch die letzten 50 Einträge mit den meisten gleichen Datensätzen.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

ich habs jetzt noch nicht getestet, aber so les ich nur die letzten 50 Einträge aus und nicht die mit den meisten Produkten.

Du hast übersehen, dass das eine Subquery ist. Erst werden 50 Datensätze ausgelesen. Diese werden dann nach Name gruppiert und absteigend nach Anzahl Datensätze pro Gruppe sortiert. Genau das, was Du haben wolltest. Nur die Sortierfolge bei der Unterabfrage fehlt noch:

Code:
SELECT name, COUNT(id) AS c FROM
   (SELECT name, id FROM tabelle ORDER BY id DESC LIMIT 50)
   GROUP BY name
   ORDER BY c DESC

LG
 
Du willst also eine List von Namen, sortiert nach der Anzahl ihrer Vorkommen, und davon dann die 50 mit den meisten Einträgen? Hab ich das jetzt richtig mitbekommen?

Warum willst du dann nach der ID sortieren? Es gibt ja immer mehrere IDs zu jedem Namen, nach welcher wolltest du dann überhaupt sortieren?
 
Hi,



Du hast übersehen, dass das eine Subquery ist. Erst werden 50 Datensätze ausgelesen. Diese werden dann nach Name gruppiert und absteigend nach Anzahl Datensätze pro Gruppe sortiert. Genau das, was Du haben wolltest. Nur die Sortierfolge bei der Unterabfrage fehlt noch:

Code:
SELECT name, COUNT(id) AS c FROM
   (SELECT name, id FROM tabelle ORDER BY id DESC LIMIT 50)
   GROUP BY name
   ORDER BY c DESC

LG

ich habs nun probiert und bekomm immer nen Error:

PHP:
SELECT name, COUNT(id) as c FROM (SELECT name, id FROM orderedprod ORDER by id DESC LIMIT 50)  GROUP by name ORDER by c DESC
 

Neue Beiträge

Zurück