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).
-
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.
-
Puis contraignez-le (quelles lignes) avec le
WHERE
clause. -
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
-
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
.
-
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 utiliserGROUP BY
, posez une question.
.
- arrêter d'utiliser
-
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 ?
.
- 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 ?
- 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.