Многие ко многим - примеры запросов - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д