Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сложный запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: для простого поиска
Slavenin
Отправлено: 18 Декабря, 2010 - 01:28:29
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




Всем доброго времени суток!
Пишу поиск по бд, принцип следующий: сначала собираю нужную информацию из нескольких таблиц, а потом по получившейся таблице делаю поиск, хотел пойти через создание временной таблицы, но mysql не разрешает делать к ней более одного запроса одновременно, поэтому приходится работать с динамически создаваемой и удаляемой таблицей. написал следующий запрос:

PHP:
скопировать код в буфер обмена
  1. $charR = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'V', 'X', 'Y', 'Z');
  2.   $nameTMd = $charR[rand(0, 24)];
  3.   $nameTMd .=rand(1, 9999999);
  4.   $nameTMd .= $charR[rand(0, 24)];
  5.  
  6. CREATE TABLE " .$nameTMd ." SELECT b.ID, b.part_name, b.part_original_number, b.part_vendor_number, c.vendor_name, d.type_name, g.model_name, f.name_mark, e.i_name, e.i_width, e.i_height, c.vendor_link, b.price_1
  7.   FROM t_model_part AS a
  8.   LEFT JOIN t_parts AS b
  9.   ON b.ID = a.ID_part
  10.   LEFT JOIN t_vendor_firms AS c
  11.   ON c.ID = b.ID_vendor_firms
  12.   LEFT JOIN t_type_parts AS d
  13.   ON d.ID = b.ID_type_parts
  14.   LEFT JOIN t_image AS e
  15.   ON e.ID = b.part_foto
  16.   left join t_models as g
  17.   ON a.ID_model = g.ID
  18.   left join t_marks as f
  19.   ON g.ID_mark = f.ID;
  20.  
  21.   SELECT * FROM " .$nameTMd ." WHERE part_name like '%" .$_POST['search'] ."%'
  22.   UNION
  23.   SELECT * FROM " .$nameTMd ." WHERE part_original_number like '%" .$_POST['search'] ."%'
  24.   UNION
  25.   SELECT * FROM " .$nameTMd ." WHERE part_vendor_number like '%" .$_POST['search'] ."%'
  26.   UNION
  27.   SELECT * FROM " .$nameTMd ." WHERE vendor_name like '%" .$_POST['search'] ."%'
  28.   UNION
  29.   SELECT * FROM " .$nameTMd ." WHERE type_name like '%" .$_POST['search'] ."%'
  30.   UNION
  31.   SELECT * FROM " .$nameTMd ." WHERE model_name like '%" .$_POST['search'] ."%'
  32.   UNION
  33.   SELECT * FROM " .$nameTMd ." WHERE name_mark like '%" .$_POST['search'] ."%'";
  34.  
  35.  $result_Serch = $objParts->ConnectDb($sqlSearch);
  36.  if(!$result_Serch)
  37.  {
  38.    echo "Поисковый запрос не удался... Код ошибки: " .mysql_errno() ." содержание: " .mysql_error();
  39.    exit();
  40.  }


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

(Отредактировано автором: 18 Декабря, 2010 - 01:31:11)

 
 Top
DlTA
Отправлено: 18 Декабря, 2010 - 01:36:28
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




нифигасе. могу посоветовать только избавлять от JOIN-ов. эта радость хорошо работает только на маленьких таблицах, на больших жутко тормозит!

Slavenin пишет:
если же действовать из скрипта, то ничего не возвращается, хотя таблица создается и запрос отрабатывает
а что должно вернуться?

Slavenin пишет:
ConnectDb($sqlSearch);
а Вы уверены что эта команда для выполнения запроса, из названия больше похоже на конект к базе.
 
 Top
Slavenin
Отправлено: 18 Декабря, 2010 - 10:21:26
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




избавляться от джоинов я не буду, так как альтернативы им я не знаю, большая таблица только одна, остальные вспомогательные и небольшого размера, запрос отрабатывает очень быстро.

$objParts->ConnectDb($sqlSearch); - это функция моего класса которая конектится к базе выполняет запрос, закрывает соединение и возвращает результат запроса, дело не в ней, так как в остальных местах кода она прекрасно отрабатывает.

вернуться должен результат селекта, как он возвращается если выполнять команду напрямую в базе.
(Добавление)
проблему пока решил разбив запрос на две части, в первой создается таблица, во второй из нее выбираются данные, и потом она уничтожается. но хотелось бы понять почему нельзя действовать в рамках одного запроса?

(Отредактировано автором: 18 Декабря, 2010 - 10:23:12)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB