2010-08-28 3 views
0

J'essaie de comprendre comment interroger ma base de données de sorte qu'il va essentiellement d'abord ordonner mes résultats, puis les GROUPER ... Cette question semble être un peu commun et j'ai trouvé des exemples mais je ne sais toujours pas comment faire cela et utiliser les exemples dans ma propre situation ... Donc toute l'aide est définitivement appréciée.Obtenir un groupe MySQL par requête pour afficher la ligne dans ce groupe avec la valeur la plus élevée

Voici mes tables MySQL:

livres
book_id
BOOK_TITLE

utilisateurs
user_id
user_name

book_reviews
review_id
book_id
user_id
review_date (date d'horodatage unix)

Je voudrais interroger 30 des dernières critiques de livres. Ils afficheront simplement:
Nom du livre
Nom d'utilisateur d'avis

Cependant, je voudrais afficher chaque pas plus d'une fois. Ainsi, l'avis affiché dans la liste devrait être le dernier commentaire ajouté. Pour ce faire, je suis simplement en train de regrouper par book_name et de commander par review_date DESC. Mais l'interrogation de cette manière n'affiche pas l'enregistrement avec la date de révision la plus récemment ajoutée comme étant groupée par ligne, donc mes données sont incorrectes.

Voici ma requête en cours:

SELECT books.books_title, users.user_name, book_reviews.review_id FROM books, users, book_reviews WHERE book_reviews.book_id = books.book_id AND book_reviews.user_id = users.user_id GROUP BY book_title ORDER BY review_date DESC LIMIT 30 

D'après ce que je l'ai lu il semble que je dois avoir un sous-requête où je reçois la valeur MAX (de review_date) mais je ne comprends toujours pas comment relier tout cela.

Merci beaucoup.

Répondre

2

Utilisation:

SELECT x.book_title, 
     x.user_name 
    FROM (SELECT b.book_title, 
       u.user_name, 
       br.review_date, 
       CASE 
        WHEN @book = b.book_title THEN @rownum := @rownum + 1 
        ELSE @rownum := 1 
       END AS rank, 
       @book := b.book_title 
      FROM BOOKS b 
      JOIN BOOK_REVIEWS br ON br.book_id = b.book_id 
      JOIN USERS u ON u.user_id = br.user_id 
      JOIN (SELECT @rownum := 0, @book := '') r 
     ORDER BY b.book_title, br.review_date DESC) x 
    WHERE x.rank = 1 
ORDER BY x.review_date DESC 
    LIMIT 30 

MySQL n'a pas d'analyse/classement/fonctionnalité de fenêtrage, mais classe les critiques où le dernier est marqué comme 1. Ceci est sur une base par livre ...

J'ai exposé la date de révision à l'ordre par le dernier de ceux qui sont les dernières par livre ...

+0

Merci pour la réponse OMG Ponies! Je suis encore assez inexpérimenté avec MySQL et n'ai jamais essayé avec des variables définies par l'utilisateur ou des conditions CASE avant donc je devrais pouvoir apprendre de ceci ... Cela dit j'ai eu une erreur en essayant de lancer ceci: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel correspondant à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '@book: = b.book_title FROM BOOKS b JOIN BOOK_REVIEWS b' à la ligne 10 – flight643

+0

@ flight643: Désolé - il manquait une virgule après "AS rank ". Les expressions CASE sont presque identiques aux instructions SWITCH, si vous les connaissez. –

Questions connexes