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
Форумы портала PHP.SU :: Версия для печати :: Сложный запрос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Сложный запрос

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

1. Slavenin - 18 Декабря, 2010 - 01:28:29 - перейти к сообщению
Всем доброго времени суток!
Пишу поиск по бд, принцип следующий: сначала собираю нужную информацию из нескольких таблиц, а потом по получившейся таблице делаю поиск, хотел пойти через создание временной таблицы, но 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.  }


если его напрямую выполнять в базе, то все хорошо работает, если же действовать из скрипта, то ничего не возвращается, и таблица не создается, в чем я ошибся? функции ошибок также не возвращают какого-либо результата...
2. DlTA - 18 Декабря, 2010 - 01:36:28 - перейти к сообщению
нифигасе. могу посоветовать только избавлять от JOIN-ов. эта радость хорошо работает только на маленьких таблицах, на больших жутко тормозит!

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

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

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

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

 

Powered by ExBB FM 1.0 RC1