Сложный запрос в MYSQL

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Сложный запрос в MYSQL

Сообщение an.viktory@gmail.com »

понимаю что должно быть очень просто, но не понимаю куда копать
есть массив параметров которые которые между собой составляют мини-фильтр

Код: Выделить всё


0 => 
  array (
    'rooms_count' => '1',
    'id_address' => '930',
    'floor' => '9',
    'grossarea' => '37',
    'price' => '1280000',
  ),
  1 => 
  array (
    'rooms_count' => '2',
    'id_address' => '579',
    'floor' => '4',
    'grossarea' => '60',
    'price' => '2290000',
  ),
  2 => 
  array (
    'rooms_count' => '1',
     'id_address' => '13',
    'floor' => '7',
    'grossarea' => '34',
    'price' => '1220000',
  ),
Этих минифильтров может быть сколько угодно.
т.е.

Код: Выделить всё

$query = Model:: find()->where(['rooms_count' => '1',
    'id_address' => '930',
    'floor' => '9',
    'grossarea' => '37',
    'price' > '1280000']; !!! тут написал не правильно сам знаю
    foreach (.........)
$query->andWhere([ 'rooms_count' => '2',
    'id_address' => '579',
    'floor' => '4',
    'grossarea' => '60',
    'price' > '2290000']
    endforeach;
    
 и т.д.
 
В правильном ли направлении я копаю? и как сделать правильно чтобы не перегружать MYSQL
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Сложный запрос в MYSQL

Сообщение an.viktory@gmail.com »

Код: Выделить всё

$Queries = \app\models\Sale::find()->where('1=0');
        $onControlsTemplate = $salefilter->getOnControls();
        if ($onControlsTemplate) {
            foreach ($onControlsTemplate as $template) {
                $query = \app\models\Sale::find()
                    ->andwhere(['rooms_count' => $template->rooms_count])
                    ->andwhere(['id_address' => $template->id_address])
                    ->andwhere(['floor' => $template->floor])
                    ->andwhere(['between', 'grossarea',
                        $template->grossarea * (100 - SaleFilters::PERSENTAGE_OF_AREA_DIVERGENSCE) / 100,
                        $template->grossarea * (100 + SaleFilters::PERSENTAGE_OF_AREA_DIVERGENSCE) / 100])
                    ->andwhere(['>=', 'price', $template->price])
                    ->limit(1);

                $Queries->union($query);

            }
        }

       
        return $Queries;
MYSQL сервер чуть не сошел сума ( 3 секунды) ... выдал почему то много результатов и без дефолтной пагинации.
отсюда да вопроса:
1. как оптимизироваться
2. Как сделать пагинацию
(SELECT * FROM `sale` WHERE 1=0 LIMIT 20) я так понял проблема в первом Query
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Сложный запрос в MYSQL

Сообщение SiZE »

Наймите программиста.
Ответить