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]   

> Без описания
wh0am1
Отправлено: 23 Января, 2014 - 08:19:20
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014  


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




Доброго времени суток. Как можно осуществить поиск по таблице, более точно.

Сейчас получается так: Ввожу к примеру "dod 430", выдает список результатов, где первые слова "dod", а нужный результат получается чуть ли не в самом низу, "Видеорегистратор DOD LS430W + SDHC 16 Gb".

Хотелось бы что бы он был вверху, то есть список сортировался по кол-ву вхождений.

SQL запрос выглядит так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT p.id, p.name, p.url, p.body, p.annotation, i.filename AS image
  2.                 FROM __products p
  3.                 LEFT JOIN __images i
  4.                 ON i.product_id = p.id
  5.                 AND i.position = (
  6.                         SELECT MIN(position)
  7.                         FROM __images
  8.                         WHERE product_id=p.id
  9.                         LIMIT 1
  10.                 )
  11.                 WHERE p.name LIKE "%' . mysql_real_escape_string ( $keyword ) . '%"
  12.                 AND visible=1
  13.                 ORDER BY p.name;
 
 Top
eai
Отправлено: 23 Января, 2014 - 08:21:23
Post Id



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


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


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




Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"
(Добавление)
eai пишет:
Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"


Ваш запрос спрашивает дай все записи с "dod" сервер их и отдает
Ваш запрос говорит, дай в порядке сортировки по имени, сервер по имени и сортирует
 
 Top
wh0am1
Отправлено: 23 Января, 2014 - 08:24:00
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014  


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




eai пишет:
Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"
(Добавление)
eai пишет:
Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"


Ваш запрос спрашивает дай все записи с "dod" сервер их и отдает
Ваш запрос говорит, дай в порядке сортировки по имени, сервер по имени и сортирует


А не подскажите, как тогда лучше составить запрос, что бы он сортировал список, где больше вхождений?
 
 Top
eai
Отправлено: 23 Января, 2014 - 08:26:40
Post Id



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


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


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




wh0am1 пишет:

А не подскажите, как тогда лучше составить запрос, что бы он сортировал список, где больше вхождений?

А что значит "больше вхождений"?
 
 Top
wh0am1
Отправлено: 23 Января, 2014 - 08:32:33
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014  


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




eai пишет:
wh0am1 пишет:

А не подскажите, как тогда лучше составить запрос, что бы он сортировал список, где больше вхождений?

А что значит "больше вхождений"?


Если пользователь в писал dod 430, и если в строке нашлось и dod и 430 то она будет в самом вверху, а остальные, где только dod уже ниже.
 
 Top
eai
Отправлено: 23 Января, 2014 - 08:40:21
Post Id



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


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


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




wh0am1 пишет:
eai пишет:
wh0am1 пишет:

А не подскажите, как тогда лучше составить запрос, что бы он сортировал список, где больше вхождений?

А что значит "больше вхождений"?


Если пользователь в писал dod 430, и если в строке нашлось и dod и 430 то она будет в самом вверху, а остальные, где только dod уже ниже.


Если у вас написано LIKE "%dob 430%" то сервер отдаст только записи где есть подстрока "dob 430" именно так через пробел

Если вам надо найти записи где есть подстрока "dob" и подстрока "430" то нужно писать запрос

(p.name LIKE "%dob%" AND p.name LIKE "%430%")

Тогда сервер отдаст все записи где есть и та и эта подстрока

Разбить строку на подстроки можно так

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $a = explode(' ',$keywords);
  4. foreach($a as $k => $v)
  5. {
  6.    $a[$k] = "p.name LIKE '%" . mysql_real_escape_string($v) ." %'";
  7. }
  8. $where = "(" . implode(' AND ',$a) . ") AND visible=1";
  9.  


В строке $where у вас будет нужное условие

К сортировки это отношения не имеет никакого

(Отредактировано автором: 23 Января, 2014 - 08:46:11)

 
 Top
peters
Отправлено: 23 Января, 2014 - 08:41:03
Post Id


Гость


Покинул форум
Сообщений всего: 90
Дата рег-ции: Янв. 2014  


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




получаем массив ключевых слов, вставляем в WHERE:
CODE (SQL):
скопировать код в буфер обмена
  1. (p.name LIKE "%'.элемент массива.'%") AND (p.name LIKE "%'.очередной элемент массива.'%")

естественно это все в цикле foreach

Тогда выберет ТОЛЬКО те строки в которых есть ВСЕ ключевые слова в поле name

если потом нужен поиск по некоторым ключевым словам, то добавляем к запросу 2-й селект UNION 'ом

(Отредактировано автором: 23 Января, 2014 - 08:58:00)

 
 Top
wh0am1
Отправлено: 23 Января, 2014 - 08:42:38
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014  


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




Спасибо, сейчас попробую.
 
 Top
wh0am1
Отправлено: 23 Января, 2014 - 11:24:15
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014  


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




Спасибо большое, все получилось.
 
 Top
wh0am1
Отправлено: 24 Января, 2014 - 08:07:23
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014  


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




У меня появился немного другой вопрос, как мне этот запрос отфильтровать в PDO?

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $a = explode ( ' ', $keyword ) ;
  3. foreach ( $a AS $k => $v ) {
  4.         $a [ $k ] = " `name` LIKE '%" . $v ."%' ";
  5. }
  6. $where = implode ( ' AND ', $a );
  7.  
  8. $sql = $db->query ( 'SELECT COUNT(`url`) FROM `products` WHERE ' . $where . ';' ) ;
  9. $count = $sql->fetchColumn();
  10.  
  11. $sql = $db->query ( 'SELECT * FROM `products` WHERE ' . $where . ' ORDER BY `gets` DESC LIMIT ' . $start . ', ' . $limit . ';' ) ;
  12. $result = $sql->fetchAll();
  13.  


С prepare, bindParam, execute не получается.
(Добавление)
Пытаюсь сделать так, но не получается:

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $a = explode ( ' ', $keyword ) ;
  3. foreach ( $a AS $k => $v ) {
  4.         $a [ $k ] = " `name` LIKE '%?%' ";
  5.         $arr [ $k + 1 ] = $v; // создаю массив переменных для фильтра начиная с 1
  6. }
  7. $where = implode ( ' AND ', $a );
  8.  
  9. // так не получается
  10. $sql = $db->prepare ( 'SELECT COUNT(`url`) FROM `products` WHERE ' . $where . ';' ) ;
  11. $sql->execute ( $arr ) ;
  12.  
  13. // так тоже не выходит
  14. $sql = $db->prepare ( 'SELECT COUNT(`url`) FROM `products` WHERE ' . $where . ';' ) ;
  15.  
  16. foreach ( $arr AS $k => $v ) {
  17.         $sql->bindParam ( $k , $v ) ;
  18. }
  19. $sql->execute ( $arr ) ;
  20.  
 
 Top
Мелкий Супермодератор
Отправлено: 24 Января, 2014 - 08:58:02
Post Id



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


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


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




PHP:
скопировать код в буфер обмена
  1. $a [ $k ] = " `name` LIKE ? ";
  2. $arr [ $k + 1 ] = '%'.$v.'%';


-----
PostgreSQL DBA
 
 Top
wh0am1
Отправлено: 24 Января, 2014 - 09:50:08
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014  


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




Мелкий пишет:
PHP:
скопировать код в буфер обмена
  1. $a [ $k ] = " `name` LIKE ? ";
  2. $arr [ $k + 1 ] = '%'.$v.'%';


Спасибо, заработало.
 
 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