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 :: расширенный поиск

 PHP.SU

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


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

> Без описания
ЛеваХФактор
Отправлено: 31 Марта, 2018 - 11:17:16
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Март 2018  


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




Здравствуйте, подскажите пожалуйста, как сделать расширенный поиск, т.е учитывать несколько полей при поиске, а не одно, как реализовано у меня сейчас
if($vvAuthor!=''){
$condition_of_Query .= "Author LIKE '%$vvAuthor%'";
} else
if($vvTitle!=''){
$condition_of_Query .= "Title LIKE '%$vvTitle%'";
}else
if($vvFac!=''){
$condition_of_Query .= "Fac LIKE '%$vvFac%'";
}else
if($vvKaf!=''){
$condition_of_Query .= "Kaf LIKE '%$vvKaf%'";
}else
if($vvUGSN!=''){
$condition_of_Query .= "UGSN LIKE '%$vvUGSN%'";
}
else
if($vvYear!=''){
$condition_of_Query .= "Year LIKE '%$vvYear%'";
}
В данном примере, у меня идет поиск по полю в отдельности, как объединить в общий запрос. Поля равнозначны, и поиск можно вести по любому полю

Спасибо
 
 Top
Vladimir Kheifets
Отправлено: 31 Марта, 2018 - 12:43:35
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


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




ЛеваХФактор пишет:
Здравствуйте, подскажите пожалуйста, как сделать расширенный поиск, т.е учитывать несколько полей при поиске, а не одно, как реализовано у меня сейчас
if($vvAuthor!=''){
$condition_of_Query .= "Author LIKE '%$vvAuthor%'";
} else
if($vvTitle!=''){
$condition_of_Query .= "Title LIKE '%$vvTitle%'";
}else
if($vvFac!=''){
$condition_of_Query .= "Fac LIKE '%$vvFac%'";
}else
if($vvKaf!=''){
$condition_of_Query .= "Kaf LIKE '%$vvKaf%'";
}else
if($vvUGSN!=''){
$condition_of_Query .= "UGSN LIKE '%$vvUGSN%'";
}
else
if($vvYear!=''){
$condition_of_Query .= "Year LIKE '%$vvYear%'";
}
В данном примере, у меня идет поиск по полю в отдельности, как объединить в общий запрос. Поля равнозначны, и поиск можно вести по любому полю

Спасибо


Добрый день!
Если нужно проверять, что один из заданных фильтров совпадает, то можно сделать так:
PHP:
скопировать код в буфер обмена
  1. if($vvAuthor!='')
  2. {
  3.         $condition_of_Query .= "Author LIKE '%$vvAuthor%'";
  4. }
  5. if($vvTitle!='')
  6. {
  7.         $condition_of_Query .= " OR Title LIKE '%$vvTitle%'";
  8. }
  9. if($vvFac!='')
  10. {
  11.         $condition_of_Query .= " OR Fac LIKE '%$vvFac%'";
  12. }
  13. if($vvKaf!='')
  14. {
  15.         $condition_of_Query .= " OR Kaf LIKE '%$vvKaf%'";
  16. }
  17. if($vvUGSN!='')
  18. {
  19.         $condition_of_Query .= " OR UGSN LIKE '%$vvUGSN%'";
  20. }
  21. if($vvYear!='')
  22. {
  23.         $condition_of_Query .= " OR Year LIKE '%$vvYear%'";
  24. }
  25. $condition_of_Query = preg_replace("/^\ OR\ /","",$condition_of_Query);


Если требуется проверять совпадение всех фильтров, то вместо OR нужно поставить AND

Удачи!

(Отредактировано автором: 31 Марта, 2018 - 13:05:38)

 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Марта, 2018 - 14:20:09
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Vladimir Kheifets пишет:
PHP:
скопировать код в буфер обмена
  1. $condition_of_Query = preg_replace("/^\ OR\ /","",$condition_of_Query);

PHP:
скопировать код в буфер обмена
  1. $condition_of_Query = '1=1';
  2. if($vvAuthor!=''){
  3.     $condition_of_Query .= "OR Author LIKE '%$vvAuthor%'";
  4. }
  5. // ....

Или:
PHP:
скопировать код в буфер обмена
  1. $conditions = [];
  2.  
  3. if($vvAuthor!=''){
  4.     $conditions[] = "Author LIKE '%$vvAuthor%'";
  5. }
  6. // ...
  7. $condition_of_Query = join(' OR ', $conditions);
 
 Top
Vladimir Kheifets
Отправлено: 01 Апреля, 2018 - 09:14:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


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




armancho7777777 пишет:
Vladimir Kheifets пишет:
PHP:
скопировать код в буфер обмена
  1. $condition_of_Query = preg_replace("/^\ OR\ /","",$condition_of_Query);

PHP:
скопировать код в буфер обмена
  1. $condition_of_Query = '1=1';
  2. if($vvAuthor!=''){
  3.     $condition_of_Query .= "OR Author LIKE '%$vvAuthor%'";
  4. }
  5. // ....

Или:
PHP:
скопировать код в буфер обмена
  1. $conditions = [];
  2.  
  3. if($vvAuthor!=''){
  4.     $conditions[] = "Author LIKE '%$vvAuthor%'";
  5. }
  6. // ...
  7. $condition_of_Query = join(' OR ', $conditions);


Добрый день!

1. Прежде всего, чтобы не запутать автора темы хочу отметить, что моё решение и Ваше выдаёт один и тот же результат.
2. Моё решение отличается тем, что я не использую массив и join, а просто сливаю строки.
3. Сравнение эффектвности:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $start = microtime(1);
  3. if(true)
  4. {
  5.         $condition_of_Query .= "Author LIKE '%$vvAuthor%'";
  6. }
  7. if(true)
  8. {
  9.         $condition_of_Query .= " OR Title LIKE '%$vvTitle%'";
  10. }
  11. if(true)
  12. {
  13.         $condition_of_Query .= " OR Fac LIKE '%$vvFac%'";
  14. }
  15. if(true)
  16. {
  17.         $condition_of_Query .= " OR Kaf LIKE '%$vvKaf%'";
  18. }
  19. if(true)
  20. {
  21.         $condition_of_Query .= " OR UGSN LIKE '%$vvUGSN%'";
  22. }
  23. if(teue)
  24. {
  25.         $condition_of_Query .= " OR Year LIKE '%$vvYear%'";
  26. }
  27. $condition_of_Query = preg_replace("/^\ OR\ /","",$condition_of_Query);
  28. echo $condition_of_Query."<br>";
  29.  
  30. $end = microtime(1);
  31. $time = $end - $start;
  32. echo $time."<hr>";      
  33. #############################################################
  34. $start = microtime(1);
  35. if(true)
  36. {
  37.         $conditions[] ="Author LIKE '%$vvAuthor%'";
  38. }
  39. if(true)
  40. {
  41.         $conditions[] ="Title LIKE '%$vvTitle%'";
  42. }
  43. if(true)
  44. {
  45.         $conditions[] ="Fac LIKE '%$vvFac%'";
  46. }
  47. if(true)
  48. {
  49.         $conditions[] ="Kaf LIKE '%$vvKaf%'";
  50. }
  51. if(true)
  52. {
  53.         $conditions[] ="UGSN LIKE '%$vvUGSN%'";
  54. }
  55. if(teue)
  56. {
  57.         $conditions[] ="Year LIKE '%$vvYear%'";
  58. }
  59. $condition_of_Query = join(' OR ', $conditions);
  60. echo $condition_of_Query."<br>";
  61. $end = microtime(1);
  62. $time = $end - $start;
  63. echo $time;
  64. ?>

Результат:
Author LIKE '%%' OR Title LIKE '%%' OR Fac LIKE '%%' OR Kaf LIKE '%%' OR UGSN LIKE '%%' OR Year LIKE '%%'
2.1934509277344E-5
-------------------------------- -------------------------------- -------------------------------- -----------
Author LIKE '%%' OR Title LIKE '%%' OR Fac LIKE '%%' OR Kaf LIKE '%%' OR UGSN LIKE '%%' OR Year LIKE '%%'
8.1062316894531E-6


Вывод:
Ваше решение работает а четыре раза медленне моего. В даном случае это не принципиально, но может плохо работать на больших объёмах данных.
Удачи!
 
 Top
Мелкий Супермодератор
Отправлено: 01 Апреля, 2018 - 10:34:04
Post Id



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


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


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




Vladimir Kheifets пишет:
Вывод:
Ваше решение работает а четыре раза медленне моего

Внимательнее надо результаты сравнивать.
Если не придираться к самому измерению - то разница в 2,5 раза. Внимание на порядок величин.

Если придираться к измерению - единичное измерение будет сильно плавать. Необходимо повторять на значительном числе итераций.

И по существу - оба времени генерации SQL не имеют значения на фоне времени выполнения этого запроса, который в большинстве случаев даст гарантированный seqscan всей таблицы.


-----
PostgreSQL DBA
 
 Top
Vladimir Kheifets
Отправлено: 01 Апреля, 2018 - 11:34:19
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


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




Мелкий пишет:
Vladimir Kheifets пишет:
Вывод:
Ваше решение работает а четыре раза медленне моего

Внимательнее надо результаты сравнивать.
Если не придираться к самому измерению - то разница в 2,5 раза. Внимание на порядок величин.

Если придираться к измерению - единичное измерение будет сильно плавать. Необходимо повторять на значительном числе итераций.

И по существу - оба времени генерации SQL не имеют значения на фоне времени выполнения этого запроса, который в большинстве случаев даст гарантированный seqscan всей таблицы.

Согласен с Вами. Невнимательно сравнил резудьтат и измерение будет сильно плавать, но вывод мой Вы процетировали не полностью:
Vladimir Kheifets пишет:
...В даном случае это не принципиально, но может плохо работать на больших объёмах данных.

(Отредактировано автором: 01 Апреля, 2018 - 11:35:27)

 
 Top
armancho7777777 Супермодератор
Отправлено: 02 Апреля, 2018 - 13:07:26
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Vladimir Kheifets пишет:
но может плохо работать на больших объёмах данных

Речь шла о фильтрах.
На каких, таких, больших объёмах???)
При 1 000 000 000 фильтрах?)))

Не вижу смысла в экономии на спичках в ущерб читабельности.
 
 Top
Строитель Модератор
Отправлено: 02 Апреля, 2018 - 13:23:54
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




armancho7777777 пишет:
Не вижу смысла в экономии на спичках в ущерб читабельности.

+100500
 
 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