Многие ко многим - примеры запросов - MySQL
Формулировка задачи:
Здравствуйте уважаемы! Пытаюсь организовать мультикатегории для новостей, но пока не понял, как составлять запросы...
Напишите пожалуйста примеры запросов с JOIN:
1. Каким запросом выбрать все новости и вывести к ним категории через запятую. Если категория не присвоена для новости, то она также выводится, просто не указана категория.
2. Выборка новостей по нескольким категориям categories.id IN (1,3).
3. Выборка по pages.id - вывод новости с категориями через запятую.
4. Изменение категорий у новости.
5. Удаление категории, которая присвоена к нескольким новостям.
6. Удаление новости, для которой присвоены несколько категорий.
Пока что я реализовал мультикатегории добавив поле pages.id_cats, в котором через запятую прописаны id категорий. Но читая Гугл я понял, что так делать не хорошо.
Заранее благодарен!
pages
:| id | title |
| 1 | Новость_1 |
| 2 | Новость_2 |
| 3 | Новость_3 |
categories
:| id | title | parent |
| 1 | Категория_1 | 0 |
| 2 | Категория_2 | 0 |
| 3 | Категория_3 | 0 |
page_cat
:| idp | idc |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
Решение задачи: «Многие ко многим - примеры запросов»
textual
Листинг программы
SELECT p.*, GROUP_CONCAT(c.id, ', ') id_category, GROUP_CONCAT(c.title, ', ') title_category FROM (SELECT DISTINCT p1.* FROM page_cat pc1 JOIN pages p1 ON pc1.idp = p1.id WHERE pc1.idc = 4) p LEFT JOIN page_cat pc ON p.id_page=pc.idp LEFT JOIN categoryes c ON c.id=pc.idc GROUP BY p.id LIMIT 5
Объяснение кода листинга программы
В данном коде выполняется запрос к базам данных, используя язык SQL. Код выполняет следующие действия:
- Выполняется запрос к таблице
page_cat, чтобы получить уникальные значенияidиз таблицыpages, которые относятся к категории сidcравным 4. Это делается с помощью подзапросаSELECT DISTINCT p1.* FROM page_cat pc1 JOIN pages p1 ON pc1.idp = p1.id WHERE pc1.idc = 4и оператораDISTINCT. - Затем результаты этого запроса (который включает
idиid_pageиз таблицыpages) присоединяются к таблицеcategoryesс помощью оператораLEFT JOIN, используяid_pageкак ключ. - Далее, результаты этого запроса группируются по
id_pageс помощью оператораGROUP BY. - Затем, для каждой группы, используется функция
GROUP_CONCAT, чтобы объединить значенияidиtitleиз таблицыcategoryesв строку, разделенную запятыми. - Наконец, результаты всего этого запроса ограничиваются первыми 5 строками с помощью оператора
LIMIT. Список действий в коде: - Выполняется подзапрос для получения уникальных значений
idиз таблицыpages, относящихся к категории сidcравным 4. - Результаты подзапроса присоединяются к таблице
categoryesс помощью оператораLEFT JOIN. - Результаты присоединения группируются по
id_pageс помощью оператораGROUP BY. - Для каждой группы, используются функции
GROUP_CONCAT, чтобы объединить значенияidиtitleиз таблицыcategoryesв строку, разделенную запятыми. - Результаты всего запроса ограничиваются первыми 5 строками с помощью оператора
LIMIT.