Одиночный SQL-запрос по отношению ко многим - PullRequest
8 голосов
/ 12 января 2010

У меня есть простая база данных с несколькими таблицами (и некоторыми образцами столбцов):

Сообщений (ID, название, содержание)

Категории (ID, название)

PostCategories (ID, ID_Post, ID_Category)

Есть ли способ создать отдельный SQL-запрос, который будет возвращать сообщения с категориями, назначенными каждому сообщению?

Ответы [ 5 ]

9 голосов
/ 13 января 2010

Вы можете использовать функцию 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
5 голосов
/ 14 августа 2015

Простые объединения работают хорошо.

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
2 голосов
/ 13 января 2010
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

Если вы имеете в виду только одну запись на пост, мне нужно будет знать, какую платформу базы данных вы используете.

1 голос
/ 13 января 2010

Конечно. Если я правильно понимаю ваш вопрос, он должен быть таким же простым, как

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;

Получение одной строки на сообщение будет немного сложнее и будет зависеть от того, какую СУБД вы используете.

0 голосов
/ 26 марта 2019

Мы также можем использовать этот запрос.

select e.*,c.* from Posts e, Categories c, PostCategories cp where cp.id in ( select s.id from PostCategories s where s.empid=e.id and s.companyid=c.id );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...