• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Mysql5 - сложное объединение условий выборки

  • Автор темы Holger Dee Assuran
  • Дата начала
H

Holger Dee Assuran

В общем есть у меня такой запросик...
[sql]select public_comm.pub_id from `public_comm`, `publication` where publication.id=public_comm.pub_id and publication.condition!='deleted' and (public_comm.comm_type='mark' and public_comm.comm_id='10') and (public_comm.comm_type='model' and public_comm.comm_id='58') group by public_comm.pub_id[/sql]

Общая идея такова - получить список айдишников статей соответствующих выборке по году, номеру журнала, разделу, рубрике, марке машины, ее модели и модификации причем каждый из параметров выборки - опционален (т.е. может отсутствовать). Запрос строится сценарием на основе имеющихся у него параметров выборки.
Вся сложность в том, что год, номер, раздел и рубрика хранятся в виде ключей-указателей в таблице самой статьи, а связи с маркой, моделью и модификацией в отдельной таблице связей статьи. Причем любая связь статьи определяется двумя полями (не считая указателя самой статьи) - comm_type определяет объект связи (марку или модель и т.д.), а comm_id определяет указатель экземпляра объекта (конкретную марку или модель и т.д.)

Вся фигня в том, что этот запрос возвращает пустой результат, хотя я знаю что вернуть ему есть что... Я пробовал заменить AND между определением марки и модели (они в скобках) на OR - в таком случае запрос возвращает набор статей, но там много ненужных данных - при выборке по марке и модели выбираются статьи связанные с любой моделью марки, а мне нужны статьи только по одной модели.
В общем голову сломал - гугль не панацея, в книжке моей умной такая ситуация не обсуждалась... что делать не ф курсе. ПРОШУ СОВЕТА
 
E

etc

Вся фигня в том, что этот запрос возвращает пустой результат, хотя я знаю что вернуть ему есть что...
Запрос, очевидно, с вами не согласен.
запрос возвращает пустой результат
У вас в условии взаимо исключающиеся подусловия, вот оттуда и пустой НД.
Остальное это гадание, давайте конкретику, тогда и думать можно.
Можно предположить вот это:
[sql]select public_comm.pub_id from `public_comm`, `publication` where publication.id=public_comm.pub_id and publication.condition!='deleted' and ((public_comm.comm_type='mark' and public_comm.comm_id='10') OR (public_comm.comm_type='model' and public_comm.comm_id='58')) group by public_comm.pub_id[/sql]
 
D

destr

Ну вы бы таблички хоть нарисовали, на слух что-то как-то плохо представляется.
(public_comm.comm_type='mark' and public_comm.comm_id='10') and (public_comm.comm_type='model' and public_comm.comm_id='58') Тут точно должно быть OR иначе условние никогда не выполнится. Вы вот так пробовали вставлять OR AND ((...)OR(...)) AND
 
H

Holger Dee Assuran

Таблица данных статьи
[sql]CREATE TABLE `publication` (
`id` int(10) unsigned NOT NULL auto_increment,
`condition` varchar(10) NOT NULL default '',
`create_date` datetime NOT NULL default '0000-00-00 00:00:00',
`creator` int(10) NOT NULL default '0',
`modify_date` datetime NOT NULL default '0000-00-00 00:00:00',
`modifyer` int(10) NOT NULL default '0',
`year` int(4) NOT NULL,
`mag_id` int(10) NOT NULL,
`part_id` int(10) NOT NULL,
`rub_id` int(10) NOT NULL,
`filename` varchar(50) NOT NULL,
`title` text NOT NULL,
`sub_title` varchar(50) NOT NULL,
`image` char(3) NOT NULL,
`announce` text NOT NULL,
`cut_text` longtext NOT NULL,
`full_text` longtext NOT NULL,
`num` int(2) NOT NULL,
PRIMARY KEY (`id`)
)[/sql]
Таблица связей статьи
[sql]CREATE TABLE `public_comm` (
`pub_id` int(10) NOT NULL,
`comm_type` varchar(20) NOT NULL,
`comm_id` int(10) NOT NULL,
KEY `pub_id` (`pub_id`),
KEY `comm_type` (`comm_type`)
)[/sql]
Повторюсь... я пробовал использовать конструкцию (... AND ...) OR (... AND ...) - такая выборка возвращает все статьи связанные с нужной маркой и любой моделью, даже если указана нужная модель. А нужно чтоб вернула все статьи связанные с маркой, но не связанные ни с какой моделью + все статьи связанные с указанной моделью.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!