SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.04.2016 08:52:26

Deniskh73
Участник
Зарегистрирован: 19.04.2016
Сообщений: 3

Запрос "многие-ко-многим" с выборкой по логическим условиям

Имеется
- таблица images (id, name) содержащая изображения
- таблица tags (id, name) содержащая метки
- таблица, которая представляет связь многие ко многим tagimages (id, idimage, idtag)

Вопрос: если даны id-шники меток, как с помощью одного запроса вытянуть определенные id из таблицы images отвечающие условиям заданным в виде логических операций. Например, найти id.images у которых ((id.tags=1) and (id.tags=2) or (id.tags=6) and (id.tags=8)). Если возможна такая операция через один запрос, то подскажите как его построить? или не наворачивать и сделать через два запроса: первый ищет по условию OR, второй из результата первого запроса выбирает только значения отвечающие условиям AND.
И пример из реальной задачи, поиск всех изображений за 2016 год за январь и февраль месяц. Условие (tags='2016' AND tags='январь') OR (tags='2016' AND tags='февраль').

Неактивен

 

#2 19.04.2016 15:00:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос "многие-ко-многим" с выборкой по логическим условиям

select i.id from images i join tagimages ti on i.id=ti.idimage join tags t on t.id=ti.idtag
where (t.name='2016' AND t.name='январь') OR (t.name='2016' AND t.name='февраль')


P.S. а зачем вам поле id в талице tagimages?

Неактивен

 

#3 19.04.2016 15:26:13

Deniskh73
Участник
Зарегистрирован: 19.04.2016
Сообщений: 3

Re: Запрос "многие-ко-многим" с выборкой по логическим условиям

id поле в tagimages просто ключевое поле. По сути без надобности, а что можно вот так просто без него?

Неактивен

 

#4 19.04.2016 15:30:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос "многие-ко-многим" с выборкой по логическим условиям

в mysql нет такого ключевого слова - id
судя по тому что у вас написано id это колонка, имхо, абсолютно не нужная, т.к. комбинация idimage, idtag является уникальной

что показывает
show create table tagimages;

Неактивен

 

#5 19.04.2016 15:39:33

Deniskh73
Участник
Зарегистрирован: 19.04.2016
Сообщений: 3

Re: Запрос "многие-ко-многим" с выборкой по логическим условиям

Что-то не работает запрос как надо - выдает нулевой результат. Можно однако сократить запрос так как я знаю id-шники тагов.
select i.id, i.link from images i join tagimage ti on i.id=ti.idimage where (ti.idtag=7/*2016*/) and (ti.idtag=8/*февраль*/)

Можно было бы сделать через ... in (". $tags. ") group by i.id having count(t.id)=" . count($arraytags)..., но логические операции будут более сложные чем просто либо AND, либо OR. Т.е. будет некая мешанина операций.

Отредактированно Deniskh73 (19.04.2016 15:44:35)

Неактивен

 

#6 19.04.2016 15:52:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос "многие-ко-многим" с выборкой по логическим условиям

да, согласен, глупость написал, там нужна группировка

насчет можно ли через один запрос - зависит от того какие более сложные операции там будут

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson