Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с MySQL, Множественный запрос на выборку по части 
:(
    Опции темы
BlackHawk
  Дата 14.8.2003, 14:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Уважаемые Cepera и MuToGeN !!!

Подскажите, пожалуйста, как правильно построить синтаксис множественного запроса на выборку по части поля, значения переменных, при этом должны транслироваться с формы из элемента <select>?

Синтаксис одиночного запроса выглядит так:
$query="SELECT * FROM `table` WHERE name LIKE '%$name%' ORDER BY `ID` ";


С уважением, BlackHawk
  Вверх
Master
Дата 14.8.2003, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



чего-чего?


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
BlackHawk
Дата 14.8.2003, 16:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











сейчас расскажу, в чем вся фишка.

Может я совсем не понятно выразился?

Идея такова: имеется форма в html-документе, на ней размещены элементы типов <text> и <select>, из которых необходимо послать запрос на выборку. Выборка должна производиться по части поля. Наличие значений, введенных в элементы формы должны определять критерии отбора записей из базы данных.

Я сделал такой запрос, который берет значение элемента формы $name (type=text), посылает запрос к базе и возвращает значение поля name, причем выборка производится по части поля. Все отлично работает, но беда в том, что мне необходимо составить комплексный запрос (т.е. так, чтобы запрос подавался сразу с нескольких элементов, соответственно выборка должна производиться также из нескольких полей базы). Вот как раз над этим я и бьюсь, синтаксис MySQL у меня хромает...

$query="SELECT * FROM `table` WHERE name LIKE '%$name%' ORDER BY `ID` ";


Люди добрые, поможите чем можите, сами мы не местные....
  Вверх
BlackHawk
Дата 14.8.2003, 16:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Опять, наверное, не так выразился:
Цитата
значение элемента формы $name (type=text),


следует понимать как: $name - переменное значение текстового поля на форме в html-документе
  Вверх
Master
Дата 14.8.2003, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



LIKE '%$name1%' AND LIKE '%$name2%' OR LIKE '%$name3%'



--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
BlackHawk
Дата 14.8.2003, 16:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Данная строка
Цитата
LIKE '%$name1%' AND LIKE '%$name2%' OR LIKE '%$name3%'


предполагает выборку разных значений из одного поля базы, а мне нужно соответственно: field_01 LIKE '%$name1%'
field_02 LIKE '%$name2%'
  Вверх
Kefir
Дата 14.8.2003, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



Так не пробовал?
Код
SELECT * FROM `table` WHERE field1 LIKE '%$name1%' AND field2 LIKE '%$name2%' ORDER BY id


PM MAIL WWW Skype   Вверх
BlackHawk
  Дата 15.8.2003, 12:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Знаешь, Kefir, большое спасибо за совет, твой пример запроса работает, но в нем есть один косяк:

для удобства объяснения немного изменю твой пример:
$query="SELECT * FROM `table` WHERE lastname LIKE '%$last_name%' and name LIKE '%$name%' ORDER BY `ID` ";

так вот, какой же косяк в нем кроется? Сейчас объясню. Данная срока запроса позволяет пользоваться только одним критерием, например, если ввести фамилию, то он найдет все записи, в которых имеются совпадения.
Допустим, мы имеем записи в таблице:

Соколов Алексей
Малышев Алексей
Макаров Виталий
Макаров Петр
Соломин Юрий

если мы введем только один параметр поиска, например имя "лекс", то будут найдены две записи:
Соколов Алексей
Малышев Алексей

также если мы введем один параметр, например фамилию "Мак", то будет найдено две записи:
Макаров Виталий
Макаров Петр

!!! но если мы введем оба параметра сразу, например имя "лекс" и фамилию "Мак", то он не найдет ни одной записи.
!!! А мне ведь нужны все Алексеи и все Макаровы, т.е. четыре записи из списка.

Запись найдется лишь та, в которой оба эти параметра совпадают!!!
Например, имя "лекс" и фамилия "Сокол" - будет найдена запись:
Соколов Алексей.


Понимаешь о чем я?
  Вверх
Cepera
Дата 15.8.2003, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PHPexp
****


Профиль
Группа: Экс. модератор
Сообщений: 2146
Регистрация: 25.3.2002
Где: Russia, Samara

Репутация: 1
Всего: 7



надо просто распарсить ответ полученный сервером, получить массив всех введеных слов и для каждого сделать запрос:
Код
SELECT * FROM `table` WHERE lastname LIKE '%$last_name%' and name LIKE '%$name%' ORDER BY `ID`

кстати, лучше даже использовать так:
Код
SELECT * FROM `table` WHERE UCASE(lastname) LIKE UCASE('%$last_name%') OR UCASE(name) LIKE UCASE('%$name%') ORDER BY `ID`

таким образом не придется думать о больших маленьких буквах + проверится данный запрос и в фамилии, и в имени в предыдущем запросе должны были выполняться оба условия
...

конечно же можно генерить запрос на каждый элемент полученного массива, но представьте себе , если пользователь введет 20 слов для поиска?smile.gif



--------------------
I know it is heavy for reading, but I know you will read it anyway...
PM MAIL WWW ICQ   Вверх
Cepera
Дата 15.8.2003, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PHPexp
****


Профиль
Группа: Экс. модератор
Сообщений: 2146
Регистрация: 25.3.2002
Где: Russia, Samara

Репутация: 1
Всего: 7



ну, а формат парсинга + проверка для элементов массива будет выглядеть так:
Код
$search - полученная строка
$search = explode(" ", $search);
for ($i = 0; $i < sizeof($search); $i++) {
$result = mysql_query("SELECT * FROM table WHERE UCASE(lastname) LIKE UCASE('%".$search[$i]."%') OR UCASE(name) LIKE UCASE('%".$search[$i]."%') ORDER BY ID");
}

мда, и что на меня нашло?8)


--------------------
I know it is heavy for reading, but I know you will read it anyway...
PM MAIL WWW ICQ   Вверх
BlackHawk
  Дата 15.8.2003, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 15.8.2003

Репутация: нет
Всего: нет



Огромное тебе спасибо, Cepera!!!
Твой первый пример работает отлично!
Во втором примере мне не понятны некоторые моменты:

как следует понимать вот это:
$search - полученная строка и
$search = explode(" ", $search); ?

Извини, но чувствую себя полным чайником....
Объясни мне значение содержимого в скобках.

P.S. Хочувыразить особую благодарность всем участникам форума.
Огромное спасибо за поддержку.

Форум Vingrad - мой самый любимый форум. adv/49.gif
PM MAIL ICQ   Вверх
Kefir
Дата 16.8.2003, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



$search - полученная строка и
$search = explode(" ", $search); ?

Значит, что search - \то та строка, которую юзер в поиске написал. С помощью explode кидаешь её в массив.
PM MAIL WWW Skype   Вверх
MuToGeN
Дата 17.8.2003, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 7
Всего: 32



Если чуток преобразовать Серегин вариант...
Код
$search - полученная строка
$search=explode($search);
$query="SELECT * FROM table WHERE";
for($i=0;$i<=sizeof($search);$i++)
{
 if($i!=0)
   $query.=" AND";
 $query.=" ( UCASE(lastname) LIKE UCASE('%$search[$i]%') OR UCASE(firstname) LIKE UCASE('%$search[$i]%') )";
}
$query.=" ORDER BY id;";
$result=mysql_query($query);



--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Cepera
Дата 17.8.2003, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PHPexp
****


Профиль
Группа: Экс. модератор
Сообщений: 2146
Регистрация: 25.3.2002
Где: Russia, Samara

Репутация: 1
Всего: 7



то-то и оно, MuToGeN, что я сразу от такого варианта отказался, как раз и упомянул - представь искать 50 или более элементов smile.gif мискл загнется через 2-3 таких запроса


--------------------
I know it is heavy for reading, but I know you will read it anyway...
PM MAIL WWW ICQ   Вверх
MuToGeN
Дата 20.8.2003, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 7
Всего: 32



Cepera, идея понятна. В принципе, это еще от размера базы зависит.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.