Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в трех таблицах. Помогите с запросом, Необходимо составит запрос поиска 
:(
    Опции темы
KonstRuctor
Дата 14.12.2006, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



Привет всем!
Есть три таблицы с одинаковой структурой.
Мне нужно написать скрипт поиска по всем трем таблицам и вывести на экран результаты.
Юзеру предлагается ввести ключевое слово и выбрать поле, по которому будет вестись поиск.
Из формы по GET приходит $s -- ключевое слово и $where -- в каком поле хочет искать.

Структура таблиц tb1, tb2, tb3:
Код

id | nazv | adres | tel | email | web


Я пытаюсь сделать так:
Код

$query="SELECT *
FROM tb1, tb2, tb3
WHERE $where LIKE '%$s%'
";


И, понятное дело, получаю ошибку.
Я хочу еще сделать грамотную сортировку по одному из полей, но мне пока хотя бы без сортировки разобраться.
Эскейп-защиту пока опускаем для упрощения кода.
Спасибо.
PM MAIL WWW ICQ   Вверх
muzer
Дата 14.12.2006, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как эти три таблицы взаимосвязаны между собой? 
Если связаны, то для решения нужно знать как.
Если не связаны, то решить можно, например, так:
Код

SELECT * FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb3 WHERE $where LIKE '%$s%'

PM WWW   Вверх
KonstRuctor
Дата 14.12.2006, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



Работает! Спасибо!
(таблицы никак не связаны)
Буду разбираться с сортировкой.

Это сообщение отредактировал(а) KonstRuctor - 14.12.2006, 03:16
PM MAIL WWW ICQ   Вверх
KonstRuctor
Дата 14.12.2006, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



Еще маленький вопросик по теме:
А если мне надо сперва посчитать $amount -- кол-во записей?
При работе с одной таблицей я делаю так:
Код

$query="
SELECT count(*) as cnt
FROM tb1
WHERE $where LIKE '%$s%'
";
$result = $db->query($query);
$am = mysql_fetch_array($result);
$amount = $am["cnt"];

А как быть в случае с тремя таблицами?
PM MAIL WWW ICQ   Вверх
Dremlin
Дата 14.12.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


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

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



если SQL, то:
Код

SELECT count(а.*) as cnt
FROM
(
   SELECT * FROM tb1 WHERE $where LIKE '%$s%'
   UNION
   SELECT * FROM tb2 WHERE $where LIKE '%$s%'
   UNION
   SELECT * FROM tb3 WHERE $where LIKE '%$s%'
) as a


можно и в ПХП:
Код

$query="
   SELECT * FROM tb1 WHERE $where LIKE '%$s%'
   UNION
   SELECT * FROM tb2 WHERE $where LIKE '%$s%'
   UNION
   SELECT * FROM tb3 WHERE $where LIKE '%$s%'
";
$result = $db->query($query);
$amount = mysql_num_rows($result);

--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
muzer
Дата 14.12.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dremlin, не надо так делать.
Если нам нужно только посчитать кол-во и больше ничего, т.е. сами данные не нужны, то и селектить их не нужно, это очень накладно.


Код

SELECT COUNT(*) FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) FROM tb3 WHERE $where LIKE '%$s%'


а в программе считываем три строки и суммируем результат.
PM WWW   Вверх
Dremlin
Дата 14.12.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


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

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



muzer, справедливо.
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
KonstRuctor
Дата 15.12.2006, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



muzer, если не сложно, можно подробнее, как это сделать правильно?
Я попробовал так:
Код

SELECT COUNT(*) as cnt FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) as cnt FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) as cnt FROM tb3 WHERE $where LIKE '%$s%'

и далее 
Код

   $result=$db->query($query);
   $am = mysql_fetch_array($result);
   $amount = $am["cnt"];

И все работает. Но я не понял, как считывать три строки и суммировать результат.
Поясню, зачем мне надо знать кол-во:
1) если 0, то выводим сообщение;
2) для постраничного вывода результатов.
Спасибо!
PM MAIL WWW ICQ   Вверх
Akina
Дата 15.12.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Если из каждой таблицы выбирается много записей, или если таблицы невелики, разумнее вместо
Код
SELECT * FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb3 WHERE $where LIKE '%$s%'
написАть
Код
SELECT * FROM 
(
    tb1
  UNION
    tb2
  UNION
    tb3
)
WHERE $where LIKE '%$s%'
и, соответственно,
Код
SELECT Count(*) FROM 
(
    tb1
  UNION
    tb2
  UNION
    tb3
)
WHERE $where LIKE '%$s%'



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
KonstRuctor
Дата 16.12.2006, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



Akina, к сожалению, такой вариант вызывает ошибку:
....your MySQL server version for the right syntax to use near 'UNION tb2 UNION tb3
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result 
Пишу так:
Код

   $query="SELECT COUNT(*) as cnt
           FROM
           (
           tb1
           UNION
           tb2
           UNION
           tb3
           )
           WHERE $where
           LIKE '%$s%'
           ";
   $result=$db->query($query);
   $am = mysql_fetch_array($result);
   $amount = $am["cnt"];
   if ( $amount > 0 )
   {
    .....
   }

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

Это сообщение отредактировал(а) KonstRuctor - 16.12.2006, 02:03
PM MAIL WWW ICQ   Вверх
KonstRuctor
Дата 16.12.2006, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



Добавлю вот еще что -- правильно* работает вот так:
Код

$query="SELECT * FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb3 WHERE $where LIKE '%$s%'
";
$result = $db>query($query);
$amount = mysql_num_rows($result);
if ( $amount > 0 )
{
        снова вызываем тот же запрос и выводим результаты
}
else echo"ничего не найдено";

Однако при больших объемах данных два таких запроса здорово загрузят сервер.
Хотелось бы, конечно, научиться по-грамотному считать $amount.
---------------------------------
* имею в виду, что результаты поиска соответствуют действительности.
PM MAIL WWW ICQ   Вверх
Dremlin
Дата 16.12.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


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

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



Снова вызывать тот же запрос не нужно, все данные и так уже получены!

Код

$query="SELECT * FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT * FROM tb3 WHERE $where LIKE '%$s%'";
$result = $db->query($query);
$amount = mysql_num_rows($result);
if ( $amount > 0 )
{
        while ( $row = mysql_fetch_array($result) )
        {
              //выводим результаты
        }
}
else echo "ничего не найдено";


Это сообщение отредактировал(а) Dremlin - 16.12.2006, 18:28
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
KonstRuctor
Дата 16.12.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



А постраничный вывод как же?
Мне надо снова вызвать этот же запрос с LIMIT и так далее.
Мне никак не разобраться, как получить ТОЛЬКО число записей.
Как из одной таблицы -- я понимаю (см. мое сообщение выше)
А как из трех -- не получается.
PM MAIL WWW ICQ   Вверх
KonstRuctor
Дата 17.12.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

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



РЕШЕНИЕ:
Код

   $qry1 = "SELECT count(*) as cnt1 FROM tb1 WHERE  $where LIKE '%$s%'";
   $res1 = $db>query($qry1);
   $am1 = mysql_fetch_array($res1);
   $amount1 = $am1["cnt1"];

   $qry2 = "SELECT count(*) as cnt2 FROM tb2  WHERE $where  LIKE '%$s%'";
   $res2 = $db->query($qry2);
   $am2 = mysql_fetch_array($res2);
   $amount2 = $am2["cnt2"];

   $qry3 = "SELECT count(*) as cnt3 FROM tb3  WHERE $where LIKE '%$s%'";
   $res3 = $db->query($qry3);
   $am3 = mysql_fetch_array($res3);
   $amount3 = $am3["cnt3"];

   $amount = $amount1 + $amount2 + $amount3;

   if ( $amount > 0 )
   {
   ..... ну и так далее.

Код получается длинный. Но все работает.
В принципе, тема закрыта. Может, у кого есть еще какие мысли?
Все большое спасибо!

Это сообщение отредактировал(а) KonstRuctor - 17.12.2006, 02:00
PM MAIL WWW ICQ   Вверх
muzer
Дата 18.12.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akina, вы MySQL путаете с чем-то другим.


KonstRuctor, я на php не пишу. Но вам нужно элементарно считать три строки, которые вернёт 
Код

SELECT COUNT(*) as cnt FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) as cnt FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) as cnt FROM tb3 WHERE $where LIKE '%$s%'


Если вы не умеете, то можно так:
Код

SELECT SUM(cnt) FROM (
SELECT COUNT(*) as cnt FROM tb1 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) as cnt FROM tb2 WHERE $where LIKE '%$s%'
UNION
SELECT COUNT(*) as cnt FROM tb3 WHERE $where LIKE '%$s%'
) tmp

Вернётся одна строка, сумма строк из трёх таблиц. Выполняться будет по времени столько же.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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