2010-04-05 6 views
11

Ich habe eine Tabelle in meiner Datenbank, die viele Datensätze enthält, einige Datensätze teilen denselben Wert für eine der Spalten. z.B.Auswählen des gebräuchlichsten Wertes aus der Relation - SQL-Anweisung

| id | name | software | 
______________________________ 
| 1 | john | photoshop | 
| 2 | paul | photoshop | 
| 3 | gary | textmate | 
| 4 | ade | fireworks | 
| 5 | fred | textmate | 
| 6 | bob | photoshop | 

Ich mag den Wert des am häufigsten vorkommenden Stück Software zurückzukehren, durch eine SQL-Anweisung.

Also im obigen Beispiel würde die erforderliche SQL-Anweisung "Photoshop" zurückgeben, da es mehr als jede andere Software vorkommt.

Ist das möglich?

Vielen Dank für Ihre Zeit.

+2

@Ronnie: welche Version von Datenbank verwenden Sie? MySQL? Oracle? –

+0

Tut mir leid, ich benutze MySQL. – Ronnie

+0

mögliches Duplikat von [Get gebräuchlicher Wert in SQL] (http://stackoverflow.com/questions/344665/get-most-common-value-in-sql) – user2284570

Antwort

22
select top 1 software 
from your_table 
group by software 
order by count(*) desc 
+0

Danke Carl, was bedeutet der "Top 1" -Teil ? Danke für die schnelle Antwort. – Ronnie

+1

@Ronnie es von der Spitze der Übereinstimmungen von der Abfrage zurück, die in diesem Fall absteigend sind, die Anzahl der Datensätze angezeigt – msarchet

+0

So wird diese Anweisung alle Datensätze in Gruppen beginnend mit der Gruppe der gängigsten Software und das Absteigen. Aber die "Top 1" wählt nur den Wert aus der ersten Gruppe aus? – Ronnie

4

Es hängt davon ab, ob Sie Standard-SQL oder herstellerspezifische Erweiterungen (ein anderes Plakat, das eine „Top-N“ Abfrage hat die nicht Standard) verwendet werden sollen. Eine Standardlösung wäre.

SELECT software, COUNT(1) 
FROM tablename 
GROUP BY software 
HAVING COUNT(1) = (
    SELECT MAX(sc) FROM (
    SELECT software, COUNT(1) sc 
    FROM tablename 
    GROUP BY software 
) 
) 

Hinweis: diese mehrere Zeilen zurückgeben können, wenn mehrere Stücke von Software für die meisten Vorkommen gebunden sind.

0

Sie können es in vielerlei Hinsicht tun, aber der einfachste Weg wäre dies

SELECT item 
FROM (SELECT item FROM your_table GROUP BY item ORDER BY COUNT(*) desc) 
WHERE ROWNUM<=1; 
+0

MySQL hat kein 'ROWNUM'. – Barmar