0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 19
1

Многие ко многим - примеры запросов

03.08.2016, 22:42. Показов 2494. Ответов 8
Метки нет (Все метки)

Здравствуйте уважаемы форумчане! Пытаюсь организовать мультикатегории для новостей, но пока не понял, как составлять запросы...

Напишите пожалуйста примеры запросов с JOIN:

1. Каким запросом выбрать все новости и вывести к ним категории через запятую. Если категория не присвоена для новости, то она также выводится, просто не указана категория.
2. Выборка новостей по нескольким категориям categories.id IN (1,3).
3. Выборка по pages.id - вывод новости с категориями через запятую.
4. Изменение категорий у новости.
5. Удаление категории, которая присвоена к нескольким новостям.
6. Удаление новости, для которой присвоены несколько категорий.

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

Пока что я реализовал мультикатегории добавив поле pages.id_cats, в котором через запятую прописаны id категорий. Но читая Гугл я понял, что так делать не хорошо.

Заранее благодарен!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2016, 22:42
Ответы с готовыми решениями:

Связь многие-ко-многим
Здравствуйте. Подскажите, пожалуйста, для организации связи "многие-ко-многим" обязательна...

Отношение многие ко многим
Здравствуйте! Есть задача Есть две сущности АВТОРЫ и КНИГИ, связь М-М (многие к многим). Создайте...

Реализация многие-ко-многим
Перечитав десятки схожих тем, я все таки решил создать новую. Не нашел ничего схожего с данной...

Связь многие ко многим
Есть 3 таблицы: Таким запросом всё как - бы отлично выводится как мне надо книга и под ней...

8
Zero day
267 / 231 / 78
Регистрация: 16.12.2015
Сообщений: 943
Записей в блоге: 4
04.08.2016, 09:40 2
alexz15, похоже, что у тебя не совсем правильно реализована связь "многие-к-многим". По идее, должно быть так. Таблицы:
Pages (логичнее было бы news, но это не так важно)
id | title
Categories (какой смысл в поле parent?)
id | title | parent
Page_cat (без поля id не будет PK в таблице, что является ошибкой)
id | idp | idc
При такой реализации получаются следующие запросы (пара, для примера):
2) Выборка новостей по нескольким категориям categories.id IN (1,3).
SQL
1
SELECT q.title, w.title FROM pages q, categories w, page_cat e WHERE q.id=e.idp AND w.id=e.idc AND wid IN (1,3)
Мой вариант написан через неявное объединение, тоже самое получится если делать через join.
6) Удаление новости, для которой присвоены несколько категорий.
SQL
1
DELETE FROM pages q WHERE q.id IN (SELECT idp FROM page_cat GROUP BY idp HAVING COUNT(id)>1)
1
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 19
04.08.2016, 13:44  [ТС] 3
Meridian21, спасибо!
Цитата Сообщение от Meridian21 Посмотреть сообщение
какой смысл в поле parent?
У меня также имеются родительские категории. Смысла parent в моем примере нет, просто показал, что он существует.

Таблица page_cat:
SQL
1
2
3
4
5
CREATE TABLE IF NOT EXISTS page_cat (
    idp INTEGER NOT NULL,
    idc INTEGER NOT NULL,
    PRIMARY KEY(idp, idc)
);
1. Каким запросом выбрать все новости и вывести к ним категории через запятую (если они присвоены к новости):
SQL
1
2
3
SELECT p.id, GROUP_CONCAT(pc.idc) FROM pages p
LEFT JOIN page_cat pc ON p.id=pc.idp
GROUP BY p.id
3. Выборка по pages.id=1 - вывод новости с категориями через запятую (если они присвоены к новости).
SQL
1
2
3
4
SELECT p.id, GROUP_CONCAT(pc.idc) FROM pages p
LEFT JOIN page_cat pc ON p.id=pc.idp
WHERE p.id=1
GROUP BY p.id
с 5 и 6 вопросами я не правильно выразился:
5. Удаление определенных категорий categories.id IN(1,3), которые, возможно, присвоены к нескольким новостям в таблице page_cat.
6. Удаление определенных новостей pages.id IN(2,3), для которых возможно, присвоены несколько категорий в таблице page_cat.
То есть, чтобы при удалении категорий и новостей не нарушалась связь с таблицей page_cat.
0
Zero day
267 / 231 / 78
Регистрация: 16.12.2015
Сообщений: 943
Записей в блоге: 4
04.08.2016, 14:02 4
alexz15, раз есть уточнение, что речь идет именно про pages.id равным 2 или 3, то запрос надо чуть дописать, хотя общая мысль останется той же:

SQL
1
DELETE FROM pages w WHERE w.id IN (SELECT q.idp FROM page_cat q WHERE q.idp IN (2,3) GROUP BY q.idp HAVING COUNT(q.id)>1)
1
19 / 19 / 6
Регистрация: 15.06.2014
Сообщений: 40
04.08.2016, 14:39 5
alexz15, Я бы сделал для случаев 5 и 6 триггеры
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TRIGGER delCategories
ON Categories
AFTER DELETE
AS
DELETE FROM page_cat 
WHERE idc = deleted.id
 
CREATE TRIGGER delPages
ON Pages
AFTER DELETE
AS
DELETE FROM page_cat 
WHERE idp = deleted.id
В этом случае после удаления строчек из таблиц Categories и Pages будут удаляться соответствующие строчки из таблицы page_cat
1
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 19
04.08.2016, 14:43  [ТС] 6
Я наверно снова не так выразился) Вообще, 5 и 6 пункты решаются двумя запросами на каждую задачу:
SQL
1
2
DELETE FROM pages WHERE id IN (2,3);
DELETE FROM page_cat WHERE idp IN (2,3);
и
SQL
1
2
DELETE FROM categoryes WHERE id_category IN (1,3);
DELETE FROM page_cat WHERE idc IN (1,3);
Просто я немного протупил от переработки)
0
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 19
08.08.2016, 15:00  [ТС] 7
Не могу понять, как составить запрос:
к новостям присвоена одна или несколько категорий.
Нужно вывести новости по id категории (c.id=4) и при этом в результате указать к каким категориям эта новость принадлежит.
Ниже запрос выводит список новостей и ОДНУ категорию, по которой делаем выборку. А нужно ВСЕ категории, к которым принадлежит новость:
SQL
1
2
3
4
5
6
7
SELECT p.*, GROUP_CONCAT(c.id, ', ') id_category, GROUP_CONCAT(c.title, ', ') title_category
FROM pages p
LEFT JOIN page_cat pc ON p.id_page=pc.idp
LEFT JOIN categoryes c ON c.id=pc.idc
WHERE c.id=4
GROUP BY p.id
LIMIT 5
Сейчас выводит:
idtitleid_categorytitle_category
13Как нас занесло на бездорожье4Subaru

Нужно:
idtitleid_categorytitle_category
13Как нас занесло на бездорожье4Путешествия, Subaru

Если делать запрос без WHERE c.id=4, то выводит список новостей и к ним категории через запятую, как нужно. Но как сделать выборку по категории?
0
11 / 11 / 1
Регистрация: 10.12.2013
Сообщений: 391
08.08.2016, 16:59 8
помогите составить запрос который будет возвращать кол-во дублирующих записей. например-
id data
1 иванов
2 петров
3 сидоров
4 петров
5 иванов
хочу получить -
сидоров - 1
иванов - 2
петров - 2
0
19 / 19 / 6
Регистрация: 15.06.2014
Сообщений: 40
09.08.2016, 10:48 9
alexz15, похоже, здесь Вам нужно использовать подзапрос, который будет вытягивать страницы нужной категории. А уже внешний запрос будет конкатенировать все категории каждой страницы.
SQL
1
2
3
4
5
6
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
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2016, 10:48
Помогаю со студенческими работами здесь

Запрос к 2 таблицам многие ко многим
Есть 2 таблицы. tbl_user //таблица с пользователями id // айдишник пользователя ...

SQL запрос многие ко многим
Добрый день! Есть таблица студентов (students) и курсов, которые они посещают (courses). Нужно...

Выбор при связи многие ко многим
у меня есть три таблицы, опишу их псевдо SQL кодом (если это так можно назвать), просто для общего...

Связь многие к одному/ один к многим
Вот не могу понять эти связи, как они действуют. Например у меня есть две таблицы: Автомобиль ...

Запрос Многие-ко-Многим ( связь большого количества таблиц)
К таблице Application нужно как то прикрепить некоторое оборудование, нужно получить название или...

Как составить запрос к трём таблицам (многие ко многим)
Есть 3 таблицы: authors - список авторов книг books - список книг books_authors - таблица связи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru