Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Логика сложного запроса
 
 автор: Ramilka   (27.10.2009 в 20:20)   письмо автору
 
 

Имеется таблица пользователей и нужно реализовать поиск людей.
На входе строка. Возможно в формате Имя Фамилия или Фамилия Имя, заранее это не известно. Может быть только Имя или только Фамилия. Возможно просто с каким-то словом, например "Пельмень".
На выходе: список людей, которые имеют совпадение с введенной фразой.

Поиск происходит по следующим полям:
- Имя
- Фамилия
- Метки
На самом деле метки представляют из себя отдельную таблицу, но сейчас это не важно.
Нужно вывести людей в следующем порядке:
- сначала те, кто имеют полное совпадение с Имя Фамилия
- затем только с Имя или только с Фамилия
- те, у кого в метках присутствует введенное слово

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

Конкретный вопрос: как лучше сделать выборку людей сначала полностью совпадающих с введенной строкой, затем только по имени или по фамилии. Возможно это все уложить только в один запрос? Понятно, что можно что-то типа такого:
<?php
/*
    $input - массив, состоящий из поисковых слов
    Например поисковый запрос "Вася Пупкин"
    $input[0] = Вася
    $input[1] = Пупкин
*/
//Полное совпадение
$query1 "SELECT * FROM users WHERE first_name = $input[0] AND last_name = $input[1]";
//Совпадение любого из слов с фамилией
$query2 "SELECT * FROM users WHERE last_name = $input[0] OR last_name = $input[1]";
//Совпадение любого из слов с именем
$query2 "SELECT * FROM users WHERE first_name = $input[0] OR first_name = $input[1]";
//Обработка этих запросов
?>

Но как в таком случае отсортировать результат по релевантности? Можно ли как-нибудь этот запрос оптимизировать, чтобы он не зависел от количества элементов в массиве? И вообще есть ли более элегантное решение?

  Ответить  
 
 автор: Aidaho   (28.10.2009 в 07:45)   письмо автору
 
   для: Ramilka   (27.10.2009 в 20:20)
 

поиск по fulltext думаю тут справится очень легко и будет именно то что нужно.. все в 1 запросе и с сортировкой по релевантности...

  Ответить  
 
 автор: Ramilka   (28.10.2009 в 14:19)   письмо автору
 
   для: Aidaho   (28.10.2009 в 07:45)
 

в данном случае это не доступно, т.к. БД innoDB

  Ответить  
 
 автор: Aidaho   (28.10.2009 в 14:59)   письмо автору
 
   для: Ramilka   (28.10.2009 в 14:19)
 

а почему нельзя переделать в MyISAM ?

  Ответить  
 
 автор: Trianon   (28.10.2009 в 15:48)   письмо автору
 
   для: Aidaho   (28.10.2009 в 14:59)
 

Движок InnoDB обычно выбирается не с бухты-барахты.

  Ответить  
 
 автор: Aidaho   (28.10.2009 в 16:06)   письмо автору
 
   для: Trianon   (28.10.2009 в 15:48)
 

это понятно, но чем то можно пренебречь ради удобства...

  Ответить  
 
 автор: Trianon   (28.10.2009 в 16:08)   письмо автору
 
   для: Aidaho   (28.10.2009 в 16:06)
 

Транзакциями?!

  Ответить  
 
 автор: Ramilka   (28.10.2009 в 17:38)   письмо автору
 
   для: Aidaho   (28.10.2009 в 16:06)
 

и secondary key?
вы немного отклонились от темы. что можете посоветовать именно по моему вопросу?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования