SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.05.2012 13:37:32

yok
Участник
Зарегистрирован: 24.03.2010
Сообщений: 13

Поиск по нескольким полям

Помогите пожалуйста, такой запрос не делал,

$sql="select kontra.id, kontra.kontora from kontra left join info on kontra.id=info.id where info.fio_3 like '%$searchcontact%'"

это работает, но нужен поиск на like по нескольким полям
две таблицы kontra,info а искать надо по kontra.fio_1 kontra.fio_2 info.fio_3 info.fio_4 info.fio_5
пытаюсь различно, но правил не нашел
$sql="select kontra.id, kontra.kontora from kontra left join info on kontra.id=info.id where (kontra.fio_1 like '%$searchcontact%' | kontra.fio_2 like '%$searchcontact%'" );
 


Подскажите синтаксис такой.

Неактивен

 

#2 02.05.2012 13:38:51

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Поиск по нескольким полям

OR вместо |

Неактивен

 

#3 02.05.2012 14:35:33

yok
Участник
Зарегистрирован: 24.03.2010
Сообщений: 13

Re: Поиск по нескольким полям

Большое спасибо, правда у меня получилось чуть иначе.
И второй вытекающий вопрос.
Я выборку задаю всех 5 полей, если хоть в одном будет совпадение. Потом я могу средствами пхп вычленить где есть совпадение, и остальные не отображать. А в запросе я никак не могу ?
Поясню.
ВОТ ЗАПРОС

$sql="select kontra.id, kontra.kontora, kontra.fio_1, kontra.fio_2, info.fio_3, info.fio_4, info.fio_5 from kontra left join info on kontra.id=info.id where
(kontra.fio_1 like '%$searchcontact%') | (kontra.fio_2 like '%$searchcontact%') | (info.fio_3 like '%$searchcontact%') | (info.fio_4 like '%$searchcontact%') | (info.fio_5 like '%$searchcontact%')"
;
 

ВОТ КУДА ВЫВОДИТ
if( $num_rows > 0 ) {
        echo "<table border='1' ><tr><td>ОБЩЕЕ КОЛИЧЕСТВО ЗАПИСЕЙ О ПРЕДПРИЯТИЯХ c такими контактами  : &nbsp; <b>".$num_rows."</b></td></tr></table><br><br>";
            echo "<table width=100% border=1 cellpadding=3 bgcolor=white><tr bgcolor=lightgrey><td width=1%>id</td><td align=\"center\">Предприятие</td><td width=70% align=\"center\">Контакт</td></tr>";
            while($res=mysql_fetch_row($result))
            {
                echo "<tr><td>".$res[0]."</td><td>&nbsp;<a href=\"?id=".$res[0]."\">".stripslashes($res[1])."</td><td> ".stripslashes($res[2])." | ".stripslashes($res[3])." | ".stripslashes($res[4])."
                | "
.stripslashes($res[5])."
                | "
.stripslashes($res[6])."
                </tr>"
;
            }
        echo "</table>";

Но совпадение только в одном fio обычно. я предполагаю средствами пхп исключить отображение ненужных фио, но предполагаю что есть грамотный подход.
Подскажите куда глядеть.

Неактивен

 

#4 02.05.2012 14:44:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Поиск по нескольким полям

Если вас не очень беспокоит производительность запроса, то можно реализовать напрямую:

$sql="select kontra.id, kontra.kontora, kontra.fio_1, kontra.fio_2, info.fio_3, info.fio_4, info.fio_5, (kontra.fio_1 like '%$searchcontact%') AS sovp1, (kontra.fio_2 like '%$searchcontact%') AS sovp2, (info.fio_3 like '%$searchcontact%') AS sovp3, (info.fio_4 like '%$searchcontact%') AS sovp4, (info.fio_5 like '%$searchcontact%') AS sovp5 from kontra left join info on kontra.id=info.id HAVING sovp1+sovp2+sovp3+sovp4+sovp5>=2;"


В колонках sovp1, ... sovp5 будет 0 или 1, если соответствующий параметр совпадает с шаблоном. В конце запроса проверка на совпадение не менее двух параметров.

Неактивен

 

#5 02.05.2012 15:22:54

yok
Участник
Зарегистрирован: 24.03.2010
Сообщений: 13

Re: Поиск по нескольким полям

Большое спасибо за науку. Локально, и производительность позволяет , точнее непроизоводительность запроса не критична.
Спасибо.

Неактивен

 

#6 02.05.2012 15:28:35

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Поиск по нескольким полям

Я не совсем точно прочитал ваш пост. Вам достаточно одного совпадения (а не двух), так что 

HAVING sovp1+sovp2+sovp3+sovp4+sovp5>=1
, но в остальном все так же.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson