2012-04-06 2 views
3

Ich habe eine Herausforderung, mit der ich nicht umgehen kann.Wie bekomme ich TOP 10 in MySQL mit kombinierten Datenzeilen?

+------+--------+-----------+-------+ 
| id | user | genres | books | 
+------+--------+-----------+-------+ 
| 1 | John | crimes | 2 | 
| 2 | John | scienc | 1 | 
| 3 | John | nature | 4 | 
| 4 | Pete | nature | 3 | 
| 5 | Pete | crime | 2 | 
| 6 | Mary | nature | 20 | 
+------+--------+-----------+-------+ 

Ich möchte eine SQL-Abfrage, die die Gesamtmenge der Bücher bekommt die Benutzer besitzen, ganz gleich das Genre und möchte sie durch ORDER, die am meisten hat.

In diesem Beispiel sehen Sie, dass Mary 20 Bücher hat, Pete 5 und John hat 7 so würde mein gewünschtes Ergebnis wie einen Array sein:

result[0][user] = "Mary"; 
result[0][total] = 20; 
result[1][user] = "John"; 
result[1][total] = 7; 
result[2][user] = "Pete"; 
result[2][total] = 5; 

Wie kann ich dies in eine SQL bekommen? Soll ich CONCAT oder TOP oder sowas benutzen? Ich benutze MySQL & PHP.

Antwort

7

Sie müssen GROUP BY mit SUM

SELECT `user`, SUM(books) AS total_books 
FROM `table` 
GROUP BY `user` 
ORDER BY total_books DESC 

Wenn Sie nur die ersten 10 dann wollen Sie

SELECT `user`, SUM(books) AS total_books 
FROM `table` 
GROUP BY `user` 
ORDER BY total_books DESC LIMIT 10` 

Durch die Art und Weise nutzen können, möchten Sie vielleicht Ihr Schema leicht zu überdenken . Das Duplizieren von Informationen verstößt gegen die Grundsätze der Normalisierung.

+-----------+-------------+ 
    | owner_id | owner_name | 
    +-----------+-------------+ 
    |  1  | John  | 
    |  2  | Pete  | 
    |  3  | Mary  | 
    +-----------+-------------+ 

und dann verweisen dies durch owner_id in Ihrer books Tabelle: Sie können eine neue owners Tabelle hinzufügen mögen.

+0

Wenn ich GROUP BY verwende, überspringe ich keine Zeilen? Werden sie alle in der SUM() enthalten sein? Über deinen Punkt bezüglich der Normalisierung ... Du hast recht, aber ich benutze ein Beispiel hier, um es einfach zu machen :-) – Glooh

+1

@glooh das ist der Sinn von GROUP BY. Es summiert alle Zeilen für jeden Benutzer. – liquorvicar

2
select user, sum(books) as total 
from your_table 
group by user 
order by sum(books) 
limit 10 
+0

Sie schreiben ORDER BY SUM (Bücher), aber lakrvicar schreibt ORDER BY total_books, wie er total_books früher angegeben hat, wie Ihr "total". Was wäre besser zu verwenden? – Glooh

+1

Ich empfehle die Verwendung von Spirituosen. –

1
SELECT sum(books) as book_count, user FROM `books` GROUP BY (user) order by book_count DESC