2010-01-12 9 views
4

J'ai une base de données simple avec quelques tables (et quelques colonnes d'échantillons):simple requête SQL sur plusieurs à plusieurs

Messages (ID, titre, contenu)

Catégories (ID, Titre)

PostCategories (ID, ID_Post, ID_Category)

Est-il possible de créer seule requête SQL w Qui renverra des messages avec des catégories qui sont assignées à chaque poste?

+0

Thx pour les réponses. J'utilise MySQL. Pour être clair, je veux dire que s'il y a 3 enregistrements dans Catégories, 1 enregistrement dans Posts et 3 enregistrements dans PostCategories (de sorte qu'un article appartient à trois catégories), la requête ne doit renvoyer qu'une seule ligne contenant le message, mais pour exemple dans une de ses colonnes seront les catégories auxquelles il appartient. Dans OOP, il s'agira d'une instance de post-objet contenant des propriétés pour l'ID, le titre, le contenu et la liste (générique) des catégories. – yojimbo87

Répondre

5

Vous pouvez utiliser la fonction GROUP_CONCAT

select p.*, group_concat(DISTINCT c.title ORDER BY c.title DESC SEPARATOR ', ') 
from Posts p 
inner join PostCategories pc on p.ID = pc.ID_Post 
inner join Categories c on pc.ID_Category = c.ID 
group by p.id, p.title, p.content 
+1

Notez que cela fonctionnera avec les versions actuelles de mysql, mais pas nécessairement avec d'autres systèmes de base de données. –

1
select p.*, c.* 
from Posts p 
inner join PostCategories pc on p.ID = pc.ID_Post 
inner join Categories c on pc.ID_Category = c.ID 

Si vous voulez dire avec un seul enregistrement par publication, je vais devoir savoir quelle plateforme de base de données vous utilisez.

1

Bien sûr. Si je comprends bien votre question, il devrait être aussi simple que

SELECT Posts.title, Categories.title 
FROM Posts, Categories, PostCategories 
WHERE PostCategories.ID_Post = Posts.ID AND PostCategories.ID_Category = Categories.ID 
ORDER BY Posts.title, Categories.title; 

en obtenir une ligne par message sera un peu plus compliqué, et dépendra de ce que SGBDR que vous utilisez.

+0

Cette syntaxe est obsolète par de nombreuses implémentations sql – bleepzter

3

Simple rejoint bien.

SELECT posts.id, posts.title, categories.id, categories.title 
FROM posts 
JOIN posts_categories ON posts.id = posts_categories.post_id 
JOIN categories ON posts_categories.category_id = categories.id 
Questions connexes