Автор Тема: Группировка WHERE в SELECT  (Прочитано 2220 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Группировка WHERE в SELECT
« : 26 Августа 2003, 18:26:01 »
Возникла проблема, с выборкой данных из нескольких таблиц.
Код (Perl):

  foreach (@subcategory) {$filter .= "$base_subcategory_table_mysql.subcategory_id =\'".$_."\' OR ";}
  $filter =~s /OR\\s+$//;
  $sql = "SELECT
            $price_main_table_mysql.price_id,
            $price_main_table_mysql.sklad,
            $price_main_table_mysql.price,
            $base_goods_table_mysql.name,
            $base_goods_table_mysql.warranty,
            $base_subcategory_table_mysql.name,
            $base_category_table_mysql.name
          FROM
            $price_main_table_mysql,
            $base_category_table_mysql,
            $base_subcategory_table_mysql,
            $base_goods_table_mysql
          WHERE
            $price_main_table_mysql.goods = $base_goods_table_mysql.goods_id AND
            $base_goods_table_mysql.subcategory = $base_subcategory_table_mysql.subcategory_id AND
            $base_subcategory_table_mysql.category = $base_category_table_mysql.category_id AND
            $filter
          ORDER BY $base_goods_table_mysql.name
          ";
  &function_prepare_sql; $i[0] = 0;
  while ($row = $sth -> fetchrow_arrayref()) {
    $price[$i[0]][0] = $row->
  • ;

    $price[$i[0]][1] = $row->[1];
    $price[$i[0]][2] = $row->[2];
    $price[$i[0]][3] = $row->[3];
    $price[$i[0]][4] = $row->[4];
    $price[$i[0]][5] = $row->[5];
    $price[0][6] = $row->[6];
    $i[0]++;
  }
  $sth -> finish();

Вообщем смысл такой: скрипту передается несколько параметров в массив @subcategory, по этим данным как раз и производится основная выборка, остальные условия просто для связи таблиц между собой.

Когда скрипту передается один параметр, то все нормально работает, но при передаче двух и более параметров производится совершенно непонятная выборка, я грешу на то, что при передаче нескольких параметров условие WHERE принимает вид:

          WHERE
            price.goods = goods.goods_id AND
            goods.subcategory = subcategory.subcategory_id AND
            subcategory.category = category.category_id AND
            subcategory.subcategory_id = \'1\' OR
            subcategory.subcategory_id = \'2\'

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

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Группировка WHERE в SELECT
« Ответ #1 : 26 Августа 2003, 19:14:33 »
Phoinix
лучше приводи запрос без perl-овых выражений.
Может
subcategory.subcategory_id IN (1,2);

то есть
$filter 
" subcategory.subcategory_id IN (".join(",", @subcategory).")";
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Группировка WHERE в SELECT
« Ответ #2 : 27 Августа 2003, 10:11:28 »
Макс
Спасибо заработало, я до этого пробовал применить подобное выражение, но не получил никакого результата, выражение имело вид:

subcategory.subcategory_id IN (\'1\', \'2\', \'3\')

А сейчас получается как:

subcategory.subcategory_id IN (1, 2, 3)

Кавычки были излишни...

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28