Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Есть таблица
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`p_1` int(11) NOT NULL,
`p_2` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
INSERT INTO `test` (`name`, `p_1`, `p_2`) VALUES
( 'A', 1, 3),( 'A', 2, 4),( 'A', 3, 1),('B', 1, 4),( 'B', 4, 4),( 'B', 3, 1),( 'C', 1, 3),( 'C', 2, 4),( 'C', 3, 1);
Необходимо произвести выборку только тех строк с именем "name" у которых обязательно имеются:
p_1=1 и p_2=3 а также обязазательно имеются: p_1=2 и p_2=4
В данном примере это должны быть строки id= 1,2,7,8
Неактивен
Или я не понял или задача решается элементарно
Отредактированно klow (25.09.2017 10:27:18)
Неактивен
Прошу прощения
Была допущена ошибка в sql импорта таблицы test
правильный вариант будет такой
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`p_1` int(11) NOT NULL,
`p_2` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
INSERT INTO `test` (`name`, `p_1`, `p_2`) VALUES
( 'A', 1, 3),( 'A', 2, 4),( 'A', 3, 1),('B', 1, 4),( 'B', 1, 3),( 'B', 3, 1),( 'C', 1, 3),( 'C', 2, 4),( 'C', 3, 1);
По предложенному выше варианту запроса выбираются строки в кторых id=1,2,4,7,8
А надо что бы были выбраны только id=1,2,7,8
Неактивен
Проверьте еще раз, 4 значение ('B', 1, 4) не может выбираться условием
Неактивен
Пардон ещё раз. По запросу выбираются строки id=1,2,5,7,8
А повторяюсь надо только id=1,2,7,8
Неактивен
А почему не должна выбираться 5 строка? Согласно условиям "у которых обязательно имеются:
p_1=1 и p_2=3 " - должна.
Неактивен
Возможно есть еще какие-то условия не озвученные?
Неактивен
Из строк содержащих значения p_1=1 , p_2=3 а также p_1=2 , p_2=4 выбираются только те, в которых для каждой группы параметров ( p_1=1 AND p_2=3) OR ( p_1=2 AND p_2=4) имеется присутвие обеих групп для определённого значения `name`
То есть применительно к таблице `test` :
Проверяем - имеется для `name` = A значения p_1=1 , p_2=3 а также p_1=2 , p_2=4 то обе строки выбираются
То же самое имеем для сторок `name` = С
Для строк `name` = B выборка не происходит так как нет присутствия обеих групп параметров в строках где `name` = B
Неактивен
Результат приближённый к нужному даёт следующий запрос.
SELECT t1.* , t2.p_1 AS t2_p1 , t2.p_2 AS t2_p2 FROM `test` AS t1
LEFT JOIN test AS t2 on t1.name =t2.name
WHERE t1.p_1=1 AND t1.p_2=3 AND t2.p_1=2 AND t2.p_2=4 AND t2.p_1 is NOT NULL
Но это не совсем то что требуется. В результате запроса выводится две строки,
а нодо что было четыре строки из исходной таблицы
Неактивен
Неактивен
Спасибо за ответ но к сожалениию этот запрос также как и мой выводит две строки , а не четыре которые содержатся в исходной таблице. При этом теряется возможность использования встроенными в движок средствами постраничной навигации. (Если конечно её не модернизировать добавив какойнибудь костыль чего очень не хочется )
Неактивен
Неактивен
Вынужден ещё раз попросить прощения, так как был некорректно составлен пример таблицы test
Последний вариант запроса не работает для следующей таблицы
Неактивен
Необходимо также добавить что в реальной задаче выборка ведётся по трём параметрам
Неактивен
Неактивен
AlexJN написал:
Необходимо также добавить что в реальной задаче выборка ведётся по трём параметрам
добавьте доп условия, только count(*)= не забудьте изменить
Неактивен
Спасибо за помощь. Мне необходимо разобраться с вашим запросом, как он работает , добавить параметры и оценить нагрузку.
Хотя проблем по идее не должно быть, таблица содержит 40 000 записей.
Неактивен
Следующий вариант оказался наиболее оптимальным по производительности и пониманию работы
Неактивен
Страниц: 1