Voici ce que je veux accomplir : sélectionnez toutes les lignes du tableau « messages » tout en récupérant également les entités liées, telles que l'auteur (du tableau « utilisateurs ») et les noms des catégories auxquelles appartient le message (à partir du tableau « catégories »).
Ce sont mes deux requêtes jusqu'à présent :
Celui-ci récupère les messages :
SÉLECTIONNER
messages.*
, users.authorName AS auteur
DE messages
utilisateurs INNER JOIN
ON users.id = posts.author
Et celui-ci récupère une liste de catégories séparées par des virgules pour un message spécifique :
SÉLECTIONNER
GROUP_CONCAT(categories.category) AS catégories
DES catégories
INNER JOIN post_category
ON post_category.categoryID = categories.id
O
post_category.postID = ?
Les deux requêtes seules fonctionnent bien.
Naturellement, lorsque les deux sont combinés, je n'aurais pas besoin de la clause WHERE de la deuxième requête. J'ai essayé d'utiliser la deuxième requête comme sous-requête dans la clause SELECT de la première, mais cela a récupéré une liste séparée par des virgules de TOUTES les catégories pour TOUS les messages. Je veux seulement les catégories pour le post sur lequel je suis en train d'itérer.
Toute aide serait grandement appréciée, et je m'excuse si tout cela n'est pas clair - c'est déjà assez difficile pour moi d'y penser, et encore moins de décrire à d'autres personnes ;)
2 réponses
Quelque chose comme ça:
SELECT posts.*, users.authorName AS author,
GROUP_CONCAT(categories.category) AS categories
FROM posts, users, categories, post_category
WHERE users.id = posts.author
AND post_category.categoryID = categories.id
AND post_category.postID = posts.id
GROUP BY posts.* /* list actual columns here */, author
Ou ai-je raté quelque chose?
Je pense que votre approche de sous-requête devrait fonctionner correctement, mais vous avez toujours besoin de la clause where dans votre sous-requête. Sinon, comment MySQL saurait-il quelles lignes récupérer ? Essayer:
SELECT posts.*, users.authorName AS author,
(SELECT GROUP_CONCAT(categories.category)
FROM categories
INNER JOIN post_category ON post_category.categoryID = categories.id
WHERE post_category.postID = posts.postID) AS categories
FROM posts
INNER JOIN users ON users.id = posts.author
Questions connexes
De nouvelles questions
mysql
MySQL est un système de gestion de base de données relationnelle (RDBMS) gratuit et open source qui utilise SQL (Structured Query Language). N'UTILISEZ PAS cette balise pour d'autres bases de données telles que SQL Server, SQLite, etc. Ce sont des bases de données différentes qui utilisent toutes leurs propres dialectes SQL pour gérer les données.