5 Stimmen

Erweiterte SQL-Abfrage. Top 12 aus jeder Kategorie (MYSQL)

Ich habe eine MYSQL5-Datenbank und PHP 5. Ich brauche eine Abfrage für eine Spiele-Websites Index-Seite, die nur die ersten 12 aus jeder Kategorie von Spielen auswählt. Hier ist, was ich bis jetzt habe.

$db->query("SELECT * FROM  `games` WHERE status = 'game_published'  AND `featured` =  '1' ORDER BY `category`");

Der PHP-Code gruppiert dann Spiele der gleichen Kategorie und zeigt sie an. Aber ja, es begrenzt nicht die Anzahl der Spiele aus jeder Kategorie, wie ich will.

So sieht die Struktur der Tabelle aus: i49.tinypic.com/aysoll.png

Hier ist ein Blogbeitrag, der dem ähnelt, was ich zu tun versuche: http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+jeder+Gruppe+(Gruppe+inneres+Limit) Aber ich kann mir keinen Reim darauf machen.

Für jede Hilfe sind wir dankbar.

1voto

Mark Byers Punkte 761508

Wie wäre es damit?

SELECT * FROM (
    SELECT
       games.*,
       @rn := CASE WHEN @category=category THEN @rn + 1 ELSE 1 END AS rn,
       @category := category
    FROM games, (SELECT @rn := 0, @category := NULL) AS vars
    WHERE status = 'game_published' AND featured = '1'
    ORDER BY category
) AS T1
WHERE rn <= 12

1voto

Adam Kiss Punkte 11591

Könnten Sie verwenden UNION wenn es sich nicht um Millionen von Typen handelt...

pseudoSQL:

(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10)
UNION
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10)
UNION
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10)

Wenn Sie ein Array von Kategorien in Ihrem PHP/ASP haben, können Sie diese Union on the fly generieren.

Mehr: http://dev.mysql.com/doc/refman/5.0/en/union.html

EDIT: Hier ist wahrscheinlich die nützlichste Quelle: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Verwenden Sie es gut ^^

0voto

Andomar Punkte 224164

Um die Technik aus den von Ihnen erwähnten Beiträgen anwenden zu können, brauchen Sie eine Möglichkeit, die Spiele zu ordnen. Sie verwenden das Artikeldatum. Dann wählen sie die Anzahl der älteren Artikel für dieses Unternehmen aus und sagen, dass es nicht mehr als drei sein dürfen.

Wenn Ihre Spieltabelle eine automatisch inkrementierende Spalte namens id können Sie die 10 besten Spiele pro Kategorie auswählen, z. B:

SELECT   *
FROM     games g1
WHERE    status = 'game_published'  
         AND featured = '1' 
         AND 10 > 
         (
         SELECT   COUNT(*)
         FROM     games g2
         WHERE    g2.status = 'game_published'  
                  AND g2.featured = '1' 
                  AND g1.category = g2.category
                  AND g2.id > g1.id
         )

En where Bedingung besagt, dass es nicht mehr als 10 Zeilen mit der gleichen Kategorie und einer höheren ID geben darf.

0voto

Tim Lytle Punkte 17229

Vielleicht gibt es eine elegantere Lösung, aber Sie können einfach eine Abfrage für jede Kategorie ausführen. Erhalten Sie zunächst eine Liste der Kategorien:

SELECT DISTINCT(category) FROM  `games`;

Dann nehmen Sie jedes der Ergebnisse und suchen nach 12 Zeilen:

SELECT * FROM games WHERE status = 'game_published'  
AND `featured` =  '1' AND `category` = $category LIMIT 12;

Natürlich müssen Sie eine Art von Rangfolgezeile hinzufügen (und nach ihr ordnen), um die top 12.

Hinweis : Vielleicht gibt es eine Möglichkeit, dies mit einer einzigen Abfrage zu tun, aber sie ist mir im Moment nicht bekannt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X