Forum Webscript.Ru

Общие => Базы данных => Тема начата: Phoinix от 26 Августа 2003, 18:26:01

Название: Группировка WHERE в SELECT
Отправлено: Phoinix от 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 вот только как это сделать не нашел...
Название: Группировка WHERE в SELECT
Отправлено: Макс от 26 Августа 2003, 19:14:33
Phoinix
лучше приводи запрос без perl-овых выражений.
Может
subcategory.subcategory_id IN (1,2);

то есть
$filter = " subcategory.subcategory_id IN (".join(",", @subcategory).")";
Название: Группировка WHERE в SELECT
Отправлено: Phoinix от 27 Августа 2003, 10:11:28
Макс
Спасибо заработало, я до этого пробовал применить подобное выражение, но не получил никакого результата, выражение имело вид:

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

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

subcategory.subcategory_id IN (1, 2, 3)

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