2016-05-09 6 views
0

Ich habe 2 Spalten Name und Typ:mySQL: zeigen nur 4 Einträge pro Typ, Gruppe nach Typ

Name | Type 
================== 
sam  | Blue 
john | red 
jones | Blue 
troy | red 
dan  | red 
ben  | Blue 
joy  | Blue 
jim  | green 
tom  | red 
edi  | green 
frank | green 
tony | green 
jimmy | red 

Wie kann ich ziehen nur 4 Zeilen pro Typ, gruppiert nach Typ, nach Typ bestellt mit mySQL?
Mein sollte Finish Ergebnis wie folgt aussehen:

Name | Type 
================== 
sam  | Blue 
jones | Blue 
ben  | Blue 
joy  | Blue 
edi  | green 
frank | green 
tony | green 
jim  | green 
john | red  
troy | red 
dan  | red 
tom  | red 
+0

Verwenden Sie die '.GroupBy()' -Funktion, um sie auf 'Type' zu ​​gruppieren. Verwenden Sie' .Take (4) 'foreach group, um top 4. auszuwählen. Dann .OrderBy()' the 'Type' –

+0

Sortiert nach Typ? Meinst du jede Zeile beginnend mit dem niedrigsten Anfangsbuchstaben des Typs? Also zum Beispiel, alle Ergebnisse, die zuerst Blau wären? –

+0

Oder in SQL (mein vorheriger Kommentar war Linq - viel einfacher in-code aufzuzählen) - 'GROUP BY', dann' SELECT TOP4' (oder 'LIMIT'), dann' ORDER BY' –

Antwort

0

Gruppe verwenden, indem Sie eine Zusammenfassung Berechnungsfunktion haben müssen. Zum Beispiel, wenn Sie wollen die Anzahl der Arten von Farbe zählen:

select count(name), type 
from your_table 
group by type 
order by type 

Wenn das, was Sie wollen, ist nur die Anzahl der Zeilen begrenzen Sie bekommen können, können Sie LIMIT-Klausel verwenden.

select * 
from your_table 
limit 4; 

Hoffe, es hilft :)

Für editierte Version:

(select * 
from your_table 
where type="blue" 
LIMIT 4) 
UNION 
(select * 
from your_table 
where type="green" 
LIMIT 4) 
UNION 
(select * 
from your_table 
where type="red" 
LIMIT 4) 

Ich weiß, es ist nicht die ele Lösung, aber ich wette, ich werde arbeiten.

Lösung 3: Diese Lösung ist ziemlich kompliziert. Sie müssen MySql @vars und eine HAVING-Klausel verwenden.

set @num := 0, @type := ''; 

select type, name, 
     @num := if(@type = type, @num + 1, 1) as row_number, 
     @type := type as dummy 
from your_table 
group by type, name 
having row_number <= 2; 
+0

Aber ich muss 4 Zeilen pro Typ ziehen, gruppieren nach Typ – samjco

+0

Lesen Sie meine Antwort, ich habe es bearbeitet. Lies den letzten Teil. – mhyst

+0

Das funktioniert nicht gut, weil ich viele Typen in meiner Tabelle habe – samjco

1

Es gibt zwei Optionen Ich schlage vor, es zu tun:

A) MyISAM-Engine und die auto_increment Anlage gelten, aber das beinhaltet für die Inszenierung Speicherung verwenden und zusätzliche Tabelle:

CREATE TEMPORARY TABLE UserLikes(
Type varchar(20) , 
name varchar(20), 
ranking int AUTO_INCREMENT, 
likes int, 
PRIMARY KEY (type, ranking ) 
) ENGINE=MyISAM; 

INSERT INTO UserLikes 
SELECT 
Type, 
Name, 
null AS ranking, 
count(*) AS likes 
FROM 
YourTable 
GROUP BY Type, Name 
ORDER BY Type, likes DESC; 

SELECT * FROM UserLikes WHERE ranking <= 4; 

B) Der andere Weg erfordert keine Vorraussetzungen, außer dem Select acce grant, aber es würde hängen bleiben, wenn die Tabelle so stark wächst:

SET @ranking = 0; 
SET @currType = space(20); 

SELECT 
    Types, 
    Name, 
    @ranking := IF(Type != @currType , 0 , @ranking + 1) AS ranking, 
    @currType := Type, 
    likes  
FROM 
(
    SELECT 
     Type, 
     Name, 
     null AS ranking, 
     count(*) AS likes 
    FROM 
     YourTable 
    GROUP BY Type, Name, 
    ORDER BY Type, likes DESC 
) AS staging 
HAVING ranking <= 4 
; 

Ich erwarte, dass dies Ihnen helfen könnte.

+0

Wie kann mir das helfen? – samjco

+0

Diese Art von Logiken ermöglicht es Ihnen, eine Art Ranking nach Kategorien zu erstellen, wie Sie es in Ihrem Beitrag beschreiben.Sie haben nur das Feld, nach dem Sie gruppieren möchten, und die Bestellkriterien richtig gesetzt, es gibt Ihnen die Position innerhalb der Kategorie, so dass Sie nur diese finale Tabelle abfragen müssen. –

+0

MyISAM auto_increment fügt automatisch jedem Element eine Position hinzu und setzt (oder setzt) ​​das Zählen bei jedem Feldwechsel fort. http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html –