Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: MySQL-выборка по двум и более параметрам во многих строках
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
MySQL не мой конёк, поэтому даже не знал, как правильно написать заголовок поста... В общем, дело в следующем.
К примеру, есть одна таблица table с двумя полями F1 и F2
Ищем в поле F2, получаем DISTINCT F1. Если параметр один, к примеру А, то на выходе получаем три записи: 7, 12, 5.
Но вот если будет два параметра А и В, то как сделать запрос, чтобы вытащить только две записи 7 и 5. Отсеиваем 12 , т.к. у него параметр В не встречается?
Параметров может быть гораздо больше , чем два.
Так, как строю запрос я - этого естественно достичь нельзя. Всё равно будут выбраны три записи.
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
Panoptik пишет:
2 в данном случае - это количество параметров в IN
Дело ведь не в самом ограничении кол-ва записей, а в том, чтоб выбирались только те, которые имеют в разных строках оба параметра (в данном случае). Если придут десять параметров, то соответственно весь десяток. Моих знаний хватает на вариант, который ооочень медленно работает. Это никак не устраивает с учетом того, что записей в таблице будут десятки тысяч.
Мой убогий вариант примерно такой:
SELECT f1 FROMTABLEWHERE f2='A'AND f1 IN(SELECT f1 FROMTABLEWHERE f2='B')
А представьте, что параметров в разы больше? )) Это ж сколько вложений делать?
А уже при пяти вложений, когда я посмотрел время выполнения запроса было такое, что волей не волей вспомнил Dial-UP
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
так вы пробовали этот вариант? разве тут выбираются не те, которые вам нужны? (Добавление)
ну вы бы может лучше сразу всё показывали, а не по кускам. может вам посоветовали, более успешный вариант выборки чем СЕЛЕКТ в СЕЛЕКТЕ. ДЖОИНЫ например
----- Just do it
Deonis
Отправлено: 06 Апреля, 2012 - 08:54:45
Посетитель
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
Panoptik пишет:
так вы пробовали этот вариант? разве тут выбираются не те, которые вам нужны? (Добавление)
ну вы бы может лучше сразу всё показывали, а не по кускам. может вам посоветовали, более успешный вариант выборки чем СЕЛЕКТ в СЕЛЕКТЕ. ДЖОИНЫ например
Тот вариант я не стал показывать изначально, как отсеянный сразу. На больше моих знаний не хватает. А ваш вариант, я конечно попробовал. Спасибо, но он не работает, как надо.
Мелкий
Отправлено: 06 Апреля, 2012 - 09:27:50
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Решение довольно-таки лобовое, но вроде будет работать.
SELECT f1 FROMTABLEWHERE f2 IN('A','B')GROUPBY f1 HAVING sum(f2='A')>0 AND sum(f2='B')>0
Предварительный фильтр в where указан, чтобы мог индекс по f2 отсечь лишнее. А учитывая группировку, пригодится составной индекс по f2 & f1
----- PostgreSQL DBA
Deonis
Отправлено: 06 Апреля, 2012 - 23:25:33
Посетитель
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
Мелкий пишет:
Решение довольно-таки лобовое, но вроде будет работать.
Да, вариант интересный. Сейчас несколько раз протестил и вроде, как всё работает, а главное скорость обработки запроса очень радует:
при моих, прости Господи, вложенных селектах, с пятью параметрами - 0.0632 сек., ваш вариант при тех же условиях - 0.0057 сек.
Так что спасибо вам и Panoptik тоже спасибо.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.