PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
wh0am1
Отправлено: 23 Января, 2014 - 08:19:20
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014
Помог: 0 раз(а)
Доброго времени суток. Как можно осуществить поиск по таблице, более точно.
Сейчас получается так: Ввожу к примеру "dod 430", выдает список результатов, где первые слова "dod", а нужный результат получается чуть ли не в самом низу, "Видеорегистратор DOD LS430W + SDHC 16 Gb".
Хотелось бы что бы он был вверху, то есть список сортировался по кол-ву вхождений.
SQL запрос выглядит так:
CODE (
SQL ):
скопировать код в буфер обмена
SELECT p. id, p. name, p. url, p. body, p. annotation, i. filename AS image
FROM __products p
LEFT JOIN __images i
ON i. product_id = p. id
AND i. position = (
SELECT MIN( position)
FROM __images
WHERE product_id= p. id
LIMIT 1
)
WHERE p. name LIKE "%' . mysql_real_escape_string ( $keyword ) . '%"
AND visible= 1
ORDER BY p. name;
eai
Отправлено: 23 Января, 2014 - 08:21:23
Частый посетитель
Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009
Откуда: Петроград
Помог: 10 раз(а)
Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"
(Добавление)
eai пишет: Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"
Ваш запрос спрашивает дай все записи с "dod" сервер их и отдает
Ваш запрос говорит, дай в порядке сортировки по имени, сервер по имени и сортирует
wh0am1
Отправлено: 23 Января, 2014 - 08:24:00
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014
Помог: 0 раз(а)
eai пишет: Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"
(Добавление)
eai пишет: Так все правильно делает сервер
"dod" меньше чем "Видедорегистратор"
Ваш запрос спрашивает дай все записи с "dod" сервер их и отдает
Ваш запрос говорит, дай в порядке сортировки по имени, сервер по имени и сортирует
А не подскажите, как тогда лучше составить запрос, что бы он сортировал список, где больше вхождений?
wh0am1
Отправлено: 23 Января, 2014 - 08:32:33
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014
Помог: 0 раз(а)
eai пишет: wh0am1 пишет:
А не подскажите, как тогда лучше составить запрос, что бы он сортировал список, где больше вхождений?
А что значит "больше вхождений"?
Если пользователь в писал dod 430, и если в строке нашлось и dod и 430 то она будет в самом вверху, а остальные, где только dod уже ниже.
eai
Отправлено: 23 Января, 2014 - 08:40:21
Частый посетитель
Покинул форум
Сообщений всего: 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%")
Тогда сервер отдаст все записи где есть и та и эта подстрока
Разбить строку на подстроки можно так
В строке $where у вас будет нужное условие
К сортировки это отношения не имеет никакого(Отредактировано автором: 23 Января, 2014 - 08:46:11)
wh0am1
Отправлено: 24 Января, 2014 - 08:07:23
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Янв. 2014
Помог: 0 раз(а)
У меня появился немного другой вопрос, как мне этот запрос отфильтровать в PDO?
CODE (
SQL ):
скопировать код в буфер обмена
$a = explode ( ' ' , $keyword ) ;
foreach ( $a AS $k => $v ) {
$a [ $k ] = " `name` LIKE '%" . $v . "%' " ;
}
$where = implode ( ' AND ' , $a ) ;
$sql = $db-> query ( 'SELECT COUNT(`url`) FROM `products` WHERE ' . $where . ';' ) ;
$count = $sql-> fetchColumn( ) ;
$sql = $db-> query ( 'SELECT * FROM `products` WHERE ' . $where . ' ORDER BY `gets` DESC LIMIT ' . $start . ', ' . $limit . ';' ) ;
$result = $sql-> fetchAll( ) ;
С prepare, bindParam, execute не получается.
(Добавление)
Пытаюсь сделать так, но не получается:
CODE (
SQL ):
скопировать код в буфер обмена
$a = explode ( ' ' , $keyword ) ;
foreach ( $a AS $k => $v ) {
$a [ $k ] = " `name` LIKE '%?%' " ;
$arr [ $k + 1 ] = $v; // создаю массив переменных для фильтра начиная с 1
}
$where = implode ( ' AND ' , $a ) ;
// так не получается
$sql = $db-> prepare ( 'SELECT COUNT(`url`) FROM `products` WHERE ' . $where . ';' ) ;
$sql-> execute ( $arr ) ;
// так тоже не выходит
$sql = $db-> prepare ( 'SELECT COUNT(`url`) FROM `products` WHERE ' . $where . ';' ) ;
foreach ( $arr AS $k => $v ) {
$sql-> bindParam ( $k , $v ) ;
}
$sql-> execute ( $arr ) ;
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB