powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос MySQL - многие ко многим
15 сообщений из 15, страница 1 из 1
Сложный запрос MySQL - многие ко многим
    #39427745
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, помогите с запросом.
Постараюсь описать что хочу получить. связь многие ко многим

формально опишу

Есть таблица items
Код: sql
1.
CREATE TABLE items  (id int,name text)



Есть таблица folders
Код: sql
1.
CREATE TABLE folders (fid int, name text)



Есть таблица соотношений
Код: sql
1.
CREATE TABLE ItemsID ( mid int, id, fid);



один folders может содержать в себе много items
в то время как один items может содержаться во многих folders

делаю выборку: хочу получить items который находится в одном из folders FID = 1 (это просто) ? исключу folders
Код: sql
1.
SELECT * FROM  ItemsID JOIN items  USING (id) WHERE fid = 1 GROUP BY id


Получу все items из folders = 1

делаю выборку: хочу получить items ИЗ НЕСКОЛЬКИХ folders FID (1,2,3)
Код: sql
1.
SELECT * FROM  ItemsID JOIN items  USING (id) WHERE fid = 1 OR fid = 2 OR fid = 3 GROUP BY id


получу items из 3 folders

а теперь вопрос:
Мне нужно выбрать items которые ОДНОВРЕМЕННО есть folders FID (1,2,3)
запрос выглядел бы так:
Код: sql
1.
SELECT * FROM  ItemsID JOIN items  USING (id) WHERE fid = 1 AND fid = 2 AND fid = 3 GROUP BY id


но это невозможно и не правильно.
Не могу найти оптимальный запрос. список folders доступен, он фиксированный, поэтому пока что сделал запрос из исключений.
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39427754
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
GROUP BY items
HAVING COUNT(DISTINCT folders) = 2
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39427771
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, правильно ли я понимаю, что я выполняю запрос
Код: sql
1.
 ... WHERE fid = 1 AND fid = 2 AND fid = 3 GROUP BY id  HAVING COUNT(DISTINCT fid) = 3 


3 является количество условий OR т.е. 3 точных вхождения ?
сейчас пробую данный запрос, вроде работает!
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39427773
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е.
Код: sql
1.
... WHERE fid = 1 OR fid = 2 OR fid = 3 GROUP BY id  HAVING COUNT(DISTINCT fid) = 3 
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39427819
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу. И если пара (id,fid) уникальна, то DISTINCT не требуется.
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39427834
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, СПАСИБО Огромное!
да, пара (id,fid) уникальны, забыл указать :-)
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39427933
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

раз такое дело. Можно еще помочь.

Как исключить items если он находится ХОТЬ в ОДНОМ из перечисленных folders ?


SELECT * FROM ItemsID JOIN items USING (id) WHERE fid <> 1 AND fid <> 3 GROUP BY id
в таком случае он выведет ITEMS из 2 FOLDERS (2,3) (1,2) и т.д. надо чтоб он полностью исключал этот ITEMS
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428014
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darknesmonkКак исключить items если он находится ХОТЬ в ОДНОМ из перечисленных folders ?
N/t/ вывести только те, что не входят ни в один из списка?
Код: sql
1.
HAVING SUM(fid IN (folder1, folder2, ... folderN)) = 0
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428203
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
нет, не то.

например:
1 ITEM лежит в 1,3 FOLDERS
2 ITEM лежим в 2,3 FOLDERS
3 ITEM лежит в 1,2 FOLDERS

делаю запрос, вывести ITEMS которого нет 3 FOLDERS
должен выйти только 3 ITEM т.к. 1, 2 ITEM есть в 3 FOLDERS
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428247
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, хотя верно!
просто сейчас не могу объединить 2 запроса.
например вывести из 3 и 1 FOLDERS исключая 2 folders
уже запутался)
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428268
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде разобрался! СПАСИБО
Надо также исключающие включить в OR но не включать в точное вхождение!
ИСКЛЮЧАЮ 3 FOLDERS выбираю ТОЧНО 1,2 FOLDERS
примерно так
Код: sql
1.
... WHERE fid = 1 OR fid = 2 OR fid = 3 GROUP BY id  HAVING COUNT(fid) = 2 AND SUM (cid in (3))=0



до этого мало работал с HAVING для сортировки агрегатных функций :)
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428273
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше единообразно:
Код: sql
1.
2.
3.
4.
WHERE        fid IN (1,2,3)
GROUP BY ID
HAVING SUM(  fid IN (1,2)     ) = 2 
   AND SUM(  fid IN (3)       )=0
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428429
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, да, так и сделал)
А теперь сделал COUNT этого чуда для ЛИМИТОВ
пришлось сделать так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT COUNT(*) FROM 
(
   SELECT * FROM  ItemsID JOIN items  USING (id)  
   WHERE fid IN (1,2,3) 
   GROUP BY ID 
   HAVING SUM(fid IN (1,2)) = 2  AND SUM(fid IN (3))=0
) 
as q 



получается теперь 2 запроса один для COUNT другой для выборки с лимитами,
по идее запрос выполняется 0.0041 сек для 4000 записей в таблице в зависимости от параметров выбора FOLDERS
думаю, это нормально?
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428472
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нормально... таблица мелкая, компактная, вся закэшена, само собой всё взлетает.
...
Рейтинг: 0 / 0
Сложный запрос MySQL - многие ко многим
    #39428497
darknesmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, хорошо, спасибо!
Вопрос закрыт :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос MySQL - многие ко многим
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]