2011-07-22 5 views
1

Je n'arrive pas à comprendre comment gérer quelque chose que j'ai pensé dans SQL. J'ai des signets et des commentaires que les utilisateurs ont publiés à leur sujet. J'utilise une seule table pour tous les commentaires. Nous avons donc une relation un-à-plusieurs entre les marque-pages et les commentaires.Afficher uniquement le meilleur résultat parmi un choix multiple

Il existe une autre table, agissant comme intermédiaire, reliant chaque marque-page à tous ses commentaires.

Il existe deux types de commentaires. Titres suggérés pour le marque-page et commentaires généraux. Les titres suggérés ont à la fois un titre et une description, tandis que les commentaires généraux ont seulement une description. Il existe également un système de notation pour les titres suggérés, afin que la page d'accueil puisse choisir le titre le mieux noté pour chaque signet à afficher.

Donc, les choses principales à clarifier. Il y a la table Bookmarks avec BID et URL, ainsi que la table Comments avec CID, Title, Comment et Rating. Le BooksNComms est la table de connexion entre eux. Ce qui précède fonctionne pour obtenir le meilleur titre et la description (commentaire) pour un certain BID. Ce que je veux faire est de faire ce qui précède pour, disons, les 10 nouveaux signets.

SELECT bookmarks.url, comments.title, comments.`comment`, comments.rating 
     FROM bookmarks 
INNER JOIN booksncomms 
     ON bookmarks.bid=booksncomms.bid 
INNER JOIN comments 
     ON comments.cid=booksncomms.cid 
     JOIN (
      SELECT bookmarks.bid 
       FROM bookmarks 
      ORDER BY bookmarks.datecreated DESC 
      LIMIT 1 
     ) 
     AS a 
     ON a.bid=bookmarks.bid 
    WHERE comments.title IS NOT NULL 
    ORDER BY bookmarks.url; 

Ce qui précède me donne tous les titres pour les 10 signets les plus récents.

Est-il possible de sélectionner uniquement le titre le mieux noté pour chacun des 10 signets les plus récents?

+0

Unreadable SQL. C'est une convention que les mots-clés SQL doivent être en majuscules pour les distinguer. :( – Shef

+0

Edité mon deuxième exemple selon vos instructions Désolé pour cela –

+0

Mis à jour ma réponse, essayez-le et faites le moi savoir si cela fonctionne ou pas – Shef

Répondre

1

(propre solution de OP, est séparée de la question)

@LefterisAslanoglou dit:

je réalisais que je connaissais la réponse à seulement quelques minutes après que j'ai posté la question ici. Ça m'a dérangé pendant des heures, mais c'était une simple question d'obtenir une table qui a le titre le mieux noté pour chaque signet, puis de le joindre à celui avec tous les titres pour les derniers signets.

SELECT bookmarks.url, comments.title, comments.comment, comments.rating 
     FROM bookmarks 
INNER JOIN booksncomms ON bookmarks.bid=booksncomms.bid 
INNER JOIN comments ON comments.cid=booksncomms.cid 
     JOIN (
      SELECT bookmarks.bid 
      FROM bookmarks 
     ORDER BY bookmarks.datecreated DESC 
      LIMIT 10 
    ) AS a ON a.bid=bookmarks.bid 
     JOIN (
      SELECT comments.cid, MAX(comments.rating) 
       AS maxrating 
      FROM comments 
     INNER JOIN booksncomms ON comments.cid=booksncomms.cid 
     GROUP BY booksncomms.bid 
    ) AS b ON b.cid=comments.cid 
    WHERE comments.title IS NOT NULL 
    ORDER BY bookmarks.datecreated DESC; 
+0

Merci d'avoir posté ma réponse séparément. ce projet ... Chaque fois que je regarde en arrière, je ris toujours de mon choix pour une table séparée pour une relation un-à-plusieurs. –

0

Essayez

SELECT bookmarks.url, comments.title, comments.`comment`, MAX(comments.rating) rating 
     FROM bookmarks 
INNER JOIN booksncomms 
     ON bookmarks.bid = booksncomms.bid 
INNER JOIN comments 
     ON comments.cid = booksncomms.cid 
    WHERE comments.title IS NOT NULL 
    ORDER BY bookmarks.datecreated DESC, bookmarks.url 
    LIMIT 10