Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql Nested Select

J'ai ajouté une réponse à la question précédente, veuillez d'abord vous y référer pour mieux comprendre.

Vous ne pouvez pas l'obtenir à partir de bb_ratings seul en le groupant et en le piratant. Vous obtenez Null parce que vous pensez en termes de grille et non d'ensembles relationnels (c'est le concept central du modèle relationnel).

  1. Avant de décider à quelle(s) table(s) aller pour répondre à votre requête, vous devez décider ce que vous voulez pour la structure de votre jeu de résultats.

  2. Puis contraignez-le (quelles lignes) avec le WHERE clause.

  3. Ensuite, déterminez où (quelles tables) obtenir les colonnes. Soit joint à plus de tables, et plus de travail sur WHERE clause; ou des sous-requêtes scalaires, corrélées à la requête externe.

Vous n'êtes pas clair sur ce que vous voulez. Il semble que vous vouliez le même rapport que la question précédente, plus une colonne pour le vote des utilisateurs donnés. Pour moi, la structure de votre ensemble de résultats est une liste de bulletins. Eh bien, je peux obtenir cela du bulletin , pas besoin d'aller sur bulletin_like et ensuite grouper ça.

Si vous pensez en termes d'ensembles, c'est très simple, pas besoin de sauter dans des cerceaux avec des vues matérialisées ou des requêtes "imbriquées" :

SELECT name AS bulletin, 
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 1
        ) AS like,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 0
        ) AS dislike,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   bl.user_id = {$user_d}
        AND   like = 1
        ) AS your_vote
    FROM bulletin b

Réponses aux commentaires

J'ai le sentiment que ce que vous dites est très important pour mon approche de SQL

  1. Oui absolument. Si vous êtes prêt à apprendre les bonnes choses dès le départ, cela :

    • vous évitera toutes sortes de problèmes plus tard
    • rendez vos requêtes plus efficaces
    • vous permet de coder plus rapidement
      .
  2. Pour l'instant, oubliez d'utiliser les jeux de résultats comme tables (beaucoup plus lents) et les tables temporaires (certainement pas nécessaires si votre base de données est normalisée). Vous êtes beaucoup mieux vaut interroger directement les tables. Vous devez apprendre divers sujets tels que le modèle relationnel; comment utiliser SQL ; comment pas utiliser SQL pour éviter les problèmes ; etc. Je suis prêt à vous aider et à rester avec vous pendant un certain temps, mais j'ai besoin de savoir que vous êtes prêt. Il faudra faire un peu d'aller-retour. Il y a un peu de bruit sur ce site, je vais donc ignorer les autres commentaires (jusqu'à la fin) et ne répondre qu'aux vôtres.

    • arrêter d'utiliser GROUP BY , cela entrave sérieusement votre compréhension de SQL. Si vous ne pouvez pas obtenir le rapport souhaité sans utiliser GROUP BY , posez une question.
      .
  3. Cette question postée. Faites-moi savoir à quel moment vous vous êtes perdu, et je vous fournirai plus de détails à partir de ce moment.

    • Pour cette question, vous voulez une liste de bulletins, avec des mentions J'aime ; n'aime pas; et cet utilisateur aime. Est-ce exact ? Avez-vous essayé le code que j'ai fourni ?
      .
  4. J'ai regardé la question liée. C'est un gâchis, et personne n'a abordé le problème plus profond; ils ont répondu au problème en surface, isolément. Vous avez maintenant une réponse mais vous ne la comprenez pas. C'est une façon très lente de progresser.