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-выборка по двум и более параметрам во многих строках

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Deonis
Отправлено: 06 Апреля, 2012 - 03:31:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




MySQL не мой конёк, поэтому даже не знал, как правильно написать заголовок поста... В общем, дело в следующем.
К примеру, есть одна таблица table с двумя полями F1 и F2

Ищем в поле F2, получаем DISTINCT F1. Если параметр один, к примеру А, то на выходе получаем три записи: 7, 12, 5.
Но вот если будет два параметра А и В, то как сделать запрос, чтобы вытащить только две записи 7 и 5. Отсеиваем 12 , т.к. у него параметр В не встречается?
Параметров может быть гораздо больше , чем два.
Так, как строю запрос я - этого естественно достичь нельзя. Всё равно будут выбраны три записи.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT F1 FROM TABLE WHERE F2 IN ('A','B')

Прошу помощи у гуру.
 
 Top
Panoptik
Отправлено: 06 Апреля, 2012 - 06:56:47
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




А если так попробовать
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT F1 FROM TABLE WHERE F2 IN ('A','B') GROUP BY F1 HAVING COUNT(F1) = 2
2 в данном случае - это количество параметров в IN

(Отредактировано автором: 06 Апреля, 2012 - 07:02:30)



-----
Just do it
 
 Top
Deonis
Отправлено: 06 Апреля, 2012 - 08:41:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Panoptik пишет:
2 в данном случае - это количество параметров в IN

Дело ведь не в самом ограничении кол-ва записей, а в том, чтоб выбирались только те, которые имеют в разных строках оба параметра (в данном случае). Если придут десять параметров, то соответственно весь десяток. Моих знаний хватает на вариант, который ооочень медленно работает. Это никак не устраивает с учетом того, что записей в таблице будут десятки тысяч.
Мой убогий вариант примерно такой:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT f1 FROM TABLE WHERE f2='A' AND f1 IN (SELECT f1 FROM TABLE WHERE f2='B')

А представьте, что параметров в разы больше? )) Это ж сколько вложений делать?
А уже при пяти вложений, когда я посмотрел время выполнения запроса было такое, что волей не волей вспомнил Dial-UP Радость

(Отредактировано автором: 06 Апреля, 2012 - 08:49:02)

 
 Top
Panoptik
Отправлено: 06 Апреля, 2012 - 08:44:13
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




так вы пробовали этот вариант? разве тут выбираются не те, которые вам нужны?
(Добавление)
ну вы бы может лучше сразу всё показывали, а не по кускам. может вам посоветовали, более успешный вариант выборки чем СЕЛЕКТ в СЕЛЕКТЕ. ДЖОИНЫ например


-----
Just do it
 
 Top
Deonis
Отправлено: 06 Апреля, 2012 - 08:54:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Panoptik пишет:
так вы пробовали этот вариант? разве тут выбираются не те, которые вам нужны?
(Добавление)
ну вы бы может лучше сразу всё показывали, а не по кускам. может вам посоветовали, более успешный вариант выборки чем СЕЛЕКТ в СЕЛЕКТЕ. ДЖОИНЫ например


Тот вариант я не стал показывать изначально, как отсеянный сразу. На больше моих знаний не хватает. А ваш вариант, я конечно попробовал. Спасибо, но он не работает, как надо.
 
 Top
Мелкий Супермодератор
Отправлено: 06 Апреля, 2012 - 09:27:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Решение довольно-таки лобовое, но вроде будет работать.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT f1 FROM TABLE WHERE f2 IN ('A','B') GROUP BY f1 HAVING sum(f2='A')>0 AND sum(f2='B')>0

Предварительный фильтр в where указан, чтобы мог индекс по f2 отсечь лишнее. А учитывая группировку, пригодится составной индекс по f2 & f1


-----
PostgreSQL DBA
 
 Top
Deonis
Отправлено: 06 Апреля, 2012 - 23:25:33
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Мелкий пишет:
Решение довольно-таки лобовое, но вроде будет работать.

Да, вариант интересный. Сейчас несколько раз протестил и вроде, как всё работает, а главное скорость обработки запроса очень радует:
при моих, прости Господи, вложенных селектах, с пятью параметрами - 0.0632 сек., ваш вариант при тех же условиях - 0.0057 сек.
Так что спасибо вам и Panoptik тоже спасибо.

(Отредактировано автором: 06 Апреля, 2012 - 23:26:05)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB