[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: INNER JOIN
Страницы: 1, 2
Kumirska
Добрый день, форумчане! Всем удачного завершения недели!

Вопрос простой, для тех, кто пишет запросы к БД часто, на знание синтаксиса SQL.

Имеется таблица: 'an_site_tmplvar_contentvalues' со структурой:

`id` int(11) NOT NULL AUTO_INCREMENT,
`tmplvarid` int(10) NOT NULL DEFAULT '0',
`contentid` int(10) NOT NULL DEFAULT '0',
`value` text

Мне нужно сделать выборки:

SELECT contentid FROM 'an_site_tmplvar_contentvalues' WHERE tmplvarid=9 AND value=1 AND contentid IN(1,2,3)

SELECT contentid FROM 'an_site_tmplvar_contentvalues' WHERE tmplvarid=6 AND value=2 AND contentid IN(1,2,3)

SELECT contentid FROM 'an_site_tmplvar_contentvalues' WHERE tmplvarid=7 AND value=11 AND contentid IN(1,2,3)

То есть надо выбрать только те contentid, которые удовлетворяют трем условиям выборки. (1,2,3) - это заранее подготовленная строка, которую я получаю из массива implode(',', $arr)

Результирующая строка должна содержать только те contentid, которые удовлетворяют всем трем селектам.

Почитав про JOIN-ы, я выбрал INNER JOIN. Вопрос лишь как правильно скомпановать это все?

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
kaww
join здесь не нужен

SELECT contentid FROM 'an_site_tmplvar_contentvalues' WHERE 
((tmplvarid=9 AND value=1)
or
(tmplvarid=6 AND value=2)
or
(tmplvarid=7 AND value=11)) and contentid IN(1,2,3)


З.Ы. "Результирующая строка должна содержать только те contentid, которые удовлетворяют всем трем селектам." такой запрос вернет пустой результат. tmplvarid не может быть одновременно равен 6, 7, 9 для одного contentid . value тоже
Kumirska
Цитата (kaww @ 7.11.2014 - 10:11)
join здесь не нужен

Так мне нужно не удовлетворение одного из условий селекта, а все три...


_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
kaww
Цитата (Kumirska @ 7.11.2014 - 10:18)
Так мне нужно не удовлетворение одного из условий селекта, а все три...

Как уже написал выше, такой запрос всегда вернет пустой результат
SELECT contentid FROM 'an_site_tmplvar_contentvalues' WHERE 
tmplvarid=9 AND value=1 and tmplvarid=6 AND value=2 and tmplvarid=7 AND value=11 and contentid IN(1,2,3)
Kumirska
Я всё же считаю, что мне нужно что-то вроде:

SELECT contentid FROM 'an_site_tmplvar_contentvalues' AS t1
INNER JOIN contentid FROM 'an_site_tmplvar_contentvalues' AS t2
INNER JOIN contentid FROM 'an_site_tmplvar_contentvalues' AS t3
where t1.tmplvarid=9 and t2.tmplvarid=6 and t3.tmplvarid=7 and t1.value=1 and t2.value=2 and t3.value=3 and t1.contentid IN(1,2,3)

Только правильно ли это синтаксически...

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
kaww
Kumirska
давайте зайдем с другой стороны. Каким должен быть результат запроса?
t1.contentid | t2.contentid | t3.contentid 
---------------------------------------------
1 | 2 | 2


так ?
Kumirska
Цитата (kaww @ 7.11.2014 - 10:39)
kaww

Ситуация такова, что есть таблица:

...
INSERT INTO `an_site_tmplvar_contentvalues` VALUES ('а1','б1','в1','г1');
INSERT INTO `an_site_tmplvar_contentvalues` VALUES ('а2','б2','в2','г2');
INSERT INTO `an_site_tmplvar_contentvalues` VALUES ('а3','б2','в1','г3');
...


VALUES ('а','б','в','г')
а-просто id записи (не нужен),
б-айди поля для заполнения,
в-айди ресурса, для которого ищется поле,
г-значение поля "б" на странице "в".

Есть несколько полей на страницах (несколько значений "б"). Допустим 3 разные (область, район, метро), которые заполнены. То есть имеют id поля ="б" и значение value="г".

Мне надо выбрать только те страницы(=ресурсы), которые имеют параметры: область - Волгоградская, район - Адмиралтейский, метро - Пушкинское. То есть должны выполнятся сразу три условия

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
Kumirska
Результат должен содержать уникальный набор чисел, которые являются id ресурса (то есть параметр "в").

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
Kumirska
Логически, я прихожу к более-менее понятному мне виду:

SELECT t1.contentid, t2.contentid, t3.contentid
FROM 'an_site_tmplvar_contentvalues' AS t1
INNER JOIN 'an_site_tmplvar_contentvalues' AS t2
INNER JOIN 'an_site_tmplvar_contentvalues' AS t3
where t1.tmplvarid=9 and t2.tmplvarid=6 and t3.tmplvarid=7 and t1.value=1 and t2.value=2 and t3.value=3 and t1.contentid IN(1,2,3)

Пока все, что удалось наковырять...

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
Kumirska
SELECT t1.contentid, t2.contentid, t3.contentid
FROM 'an_site_tmplvar_contentvalues' AS t1
INNER JOIN 'an_site_tmplvar_contentvalues' AS t2 on t1.contentid=t2.contentid
INNER JOIN 'an_site_tmplvar_contentvalues' AS t3 on t2.contentid=t3.contentid
where t1.tmplvarid=9 and t2.tmplvarid=6 and t3.tmplvarid=7 and t1.value=1 and t2.value=2 and t3.value=3 and t1.contentid IN(1,2,3)


Еще добавил on t1.contentid=t2.contentid..Я так понял это обязательно для сопоставления

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
kaww
Цитата (Kumirska @ 7.11.2014 - 11:08)
Результат должен содержать уникальный набор чисел, которые являются id ресурса (то есть параметр "в").

Тогда запрос из первого моего поста можно дополнить
SELECT contentid, count(*) as cnt FROM 'an_site_tmplvar_contentvalues' WHERE 
((tmplvarid=9 AND value=1)
or
(tmplvarid=6 AND value=2)
or
(tmplvarid=7 AND value=11)) and contentid IN(1,2,3)
group by contentid having cnt = 3;

где 3 - кол-во условий
Kumirska
Цитата (kaww @ 7.11.2014 - 11:39)
kaww

Не сразу понял логику запроса твоего. Но, кажется, я узнал что-то новое!

Если я не прав, поправь меня:
Мы делаем выборку по трем условиям с OR между ними и выбираем только те contentid, которые удовлетворяют сразу трем условиям:
((tmplvarid=9 AND value=1) 
or
(tmplvarid=6 AND value=2)
or
(tmplvarid=7 AND value=11)) and contentid IN(1,2,3)

Получается, если айдишник найден в результатах трижды, следовательно он прошел все три фильтра?

Я думал если 1-ый фильтр tmplvarid=9 AND value=1 вернет true, то не проверяются уже:
or
(tmplvarid=6 AND value=2)
or
(tmplvarid=7 AND value=11))



_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
kaww
Цитата (Kumirska @ 7.11.2014 - 11:52)
Получается, если айдишник найден в результатах трижды, следовательно он прошел все три фильтра?

три строки с одинаковым contentid прошли проверку
Цитата (Kumirska @ 7.11.2014 - 11:52)
думал если 1-ый фильтр tmplvarid=9 AND value=1 вернет true, то не проверяются уже

верно (наверное. хз как там работает оптимизатор smile.gif ).Но проверка останавливается только для этой строки, другие же так же проверяются на соответствие всему условию.
Kumirska
« Execution of a query to the database failed - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN `an_site_tmplvar_contentvalues` t2 ON t1.contentid=t2.contentid WHERE' at line 1 »
SQL > SELECT t1.contentid FROM `an_site_tmplvar_contentvalues` t1 
WHERE t1.tmplvarid=9 and t1.value=1
INNER JOIN `an_site_tmplvar_contentvalues` t2 ON t1.contentid=t2.contentid
WHERE t2.tmplvarid=6 and t2.value=1 and t1.contentid IN(41,40,39,43,42,33)


Результат на сегодня не утешителен..

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
Kumirska
Все, получилось! Ура))

SELECT t1.contentid FROM `an_site_tmplvar_contentvalues` t1 
INNER JOIN `an_site_tmplvar_contentvalues` t2 ON t1.contentid=t2.contentid
WHERE t1.tmplvarid=9 and t1.value=1 and t2.tmplvarid=6 and t2.value=1 and t1.contentid IN(41,40,39,43,42,33)


А еще, я сделал запрос динамическим, формируется в php. В этом была как раз сложность, что параметров может прийти от 1 до 10, и джоины должны были плодиться сами, в зависимости от кол-ва параметров в GET! :)

_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.