Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 19

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

03.08.2016, 22:42. Показов 4210. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2016, 22:42
Ответы с готовыми решениями:

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

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

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

8
Zero day
 Аватар для Meridian21
267 / 231 / 78
Регистрация: 16.12.2015
Сообщений: 943
Записей в блоге: 4
04.08.2016, 09:40
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  [ТС]
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
 Аватар для Meridian21
267 / 231 / 78
Регистрация: 16.12.2015
Сообщений: 943
Записей в блоге: 4
04.08.2016, 14:02
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
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  [ТС]
Я наверно снова не так выразился) Вообще, 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  [ТС]
Не могу понять, как составить запрос:
к новостям присвоена одна или несколько категорий.
Нужно вывести новости по 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
помогите составить запрос который будет возвращать кол-во дублирующих записей. например-
id data
1 иванов
2 петров
3 сидоров
4 петров
5 иванов
хочу получить -
сидоров - 1
иванов - 2
петров - 2
0
19 / 19 / 6
Регистрация: 15.06.2014
Сообщений: 40
09.08.2016, 10:48
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2016, 10:48
Помогаю со студенческими работами здесь

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

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

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

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

Связь многие к одному/ один к многим
Вот не могу понять эти связи, как они действуют. Например у меня есть две таблицы: Автомобиль create table car( id int(2) NOT...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru