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
Форумы портала PHP.SU :: Версия для печати :: расширенный поиск
Форумы портала PHP.SU » » Вопросы новичков » расширенный поиск

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

1. ЛеваХФактор - 31 Марта, 2018 - 11:17:16 - перейти к сообщению
Здравствуйте, подскажите пожалуйста, как сделать расширенный поиск, т.е учитывать несколько полей при поиске, а не одно, как реализовано у меня сейчас
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%'";
}
В данном примере, у меня идет поиск по полю в отдельности, как объединить в общий запрос. Поля равнозначны, и поиск можно вести по любому полю

Спасибо
2. Vladimir Kheifets - 31 Марта, 2018 - 12:43:35 - перейти к сообщению
ЛеваХФактор пишет:
Здравствуйте, подскажите пожалуйста, как сделать расширенный поиск, т.е учитывать несколько полей при поиске, а не одно, как реализовано у меня сейчас
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

Удачи!
3. armancho7777777 - 31 Марта, 2018 - 14:20:09 - перейти к сообщению
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);
4. Vladimir Kheifets - 01 Апреля, 2018 - 09:14:46 - перейти к сообщению
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


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

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

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

И по существу - оба времени генерации SQL не имеют значения на фоне времени выполнения этого запроса, который в большинстве случаев даст гарантированный seqscan всей таблицы.
6. Vladimir Kheifets - 01 Апреля, 2018 - 11:34:19 - перейти к сообщению
Мелкий пишет:
Vladimir Kheifets пишет:
Вывод:
Ваше решение работает а четыре раза медленне моего

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

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

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

Согласен с Вами. Невнимательно сравнил резудьтат и измерение будет сильно плавать, но вывод мой Вы процетировали не полностью:
Vladimir Kheifets пишет:
...В даном случае это не принципиально, но может плохо работать на больших объёмах данных.
7. armancho7777777 - 02 Апреля, 2018 - 13:07:26 - перейти к сообщению
Vladimir Kheifets пишет:
но может плохо работать на больших объёмах данных

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

Не вижу смысла в экономии на спичках в ущерб читабельности.
8. Строитель - 02 Апреля, 2018 - 13:23:54 - перейти к сообщению
armancho7777777 пишет:
Не вижу смысла в экономии на спичках в ущерб читабельности.

+100500

 

Powered by ExBB FM 1.0 RC1