JOIN не корректно работает

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Yaroslav
Сообщения: 7
Зарегистрирован: 2016.02.22, 19:29

JOIN не корректно работает

Сообщение Yaroslav »

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

SELECT *
FROM food 
JOIN order_food ON order_food.id_food = food.id_food
GROUP BY food.name_food
ORDER BY COUNT( food.name_food ) DESC Limit 5');
есть такой запрос выводит из таблиц 5 популярных блюд
Вот код который использую для yii2

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

$command = Yii::$app->db->createCommand( '
SELECT food.name_food, COUNT( food.name_food ) as cnt_food,
 order_food.id_food, order_food.id_order
FROM food 
JOIN order_food ON order_food.id_food = food.id_food
GROUP BY food.name_food
ORDER BY COUNT( food.name_food ) DESC Limit 5' );
$models = $command->queryAll();
for ( $i = 0; $i < count( $models ); $i++ ) {
$models[$i]['place'] = $i + 1;
}

$dataProvider3 = new ArrayDataProvider([
 'allModels' => $models,
'sort' => [

    'attributes' => [
        'name_food',
        'id_food',
        'cnt_food',
        'matches' => [ 'default' => SORT_DESC ],
    ],
],
'pagination' => [ 'pageSize' => 100 ],
 ]);

https://translate.google.ru/translate?h ... 2F98594247

На изображение 3 картинки 1) это вывод из консоли mysql 2) вывод из PHPMYADMIN 3)из yii2
Последний раз редактировалось Yaroslav 2016.03.01, 09:02, всего редактировалось 1 раз.
Yaroslav
Сообщения: 7
Зарегистрирован: 2016.02.22, 19:29

Re: JOIN не корректно работает

Сообщение Yaroslav »

Я так понимаю, никто не знает, почему JOIN используя YII2 так работает странно
Аватара пользователя
DiWorm
Сообщения: 14
Зарегистрирован: 2016.02.26, 15:17

Re: JOIN не корректно работает

Сообщение DiWorm »

Не знаю, поможет ли вам эта информация, но в книжке по Yii, которую читаю, есть вот такая информация:
Yii 2.0 осуществляет жадную загрузку связи не так, как это было в 1.1. В частности, в версии 1.1 для выбора данных из основной и связанной таблиц будет использован запрос JOIN. В Yii 2.0 будут выполнены два запроса без использования JOIN: первый запрос возвращает данные для основной таблицы, а второй, осуществляющий фильтрацию по первичным ключами основной таблицы для связанной. Вместо того, чтобы при выборке большого количества записей возвращать объекты ActiveRecord, вы можете использовать в построении запроса метод asArray(). Это заставит вернуть результат запроса в виде массива, что при большом количестве записей может существенно снизить затрачиваемое процессорное время и объјм потребляемой памяти. Например:
$customers = Customer::find()->asArray()->all();
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: JOIN не корректно работает

Сообщение zelenin »

Yaroslav писал(а):Я так понимаю, никто не знает, почему JOIN используя YII2 так работает странно
1. Надо ждать ответа, а не апать тему.
2. Ex.ua ограничивает доступ не-украинским ip, а в добавок он забанен в России.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: JOIN не корректно работает

Сообщение samdark »

Да, изображение хорошо-бы перезалить куда-нибудь...
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: JOIN не корректно работает

Сообщение Nerf »

https://translate.google.ru/translate?h ... 2F98594247
Вы бы запрос из лога дебагера выложили бы лучше.
И что это:
'matches' => [ 'default' => SORT_DESC ],
Yaroslav
Сообщения: 7
Зарегистрирован: 2016.02.22, 19:29

Re: JOIN не корректно работает

Сообщение Yaroslav »

'matches' => [ 'default' => SORT_DESC ],
Сортировка по умолчанию, но поля такого нет. И он, ни на что не влияет. Сама суть в том, что при JOIN, добавляются лишние поля в YII2 результатирующей таблице, чего не происходит, когда тот же запрос используешь не применяя обертку от YII2. В итоге и подсчеты идут другие, и другие записи выходят в топ и выводятся постетителю.
Yaroslav
Сообщения: 7
Зарегистрирован: 2016.02.22, 19:29

Re: JOIN не корректно работает

Сообщение Yaroslav »

Nerf писал(а):https://translate.google.ru/translate?h ... 2F98594247
Вы бы запрос из лога дебагера выложили бы лучше.
И что это:
'matches' => [ 'default' => SORT_DESC ],
Спасибо что разместили прислали ссылку, от транслейтгугл. В отношении запроса, проверил убрал эту запись
'matches' => [ 'default' => SORT_DESC ],
ни на что не влияет, вывод остался прежним.
Yaroslav
Сообщения: 7
Зарегистрирован: 2016.02.22, 19:29

Re: JOIN не корректно работает

Сообщение Yaroslav »

DiWorm писал(а):Не знаю, поможет ли вам эта информация, но в книжке по Yii, которую читаю, есть вот такая информация:
Yii 2.0 осуществляет жадную загрузку связи не так, как это было в 1.1. В частности, в версии 1.1 для выбора данных из основной и связанной таблиц будет использован запрос JOIN. В Yii 2.0 будут выполнены два запроса без использования JOIN: первый запрос возвращает данные для основной таблицы, а второй, осуществляющий фильтрацию по первичным ключами основной таблицы для связанной. Вместо того, чтобы при выборке большого количества записей возвращать объекты ActiveRecord, вы можете использовать в построении запроса метод asArray(). Это заставит вернуть результат запроса в виде массива, что при большом количестве записей может существенно снизить затрачиваемое процессорное время и объјм потребляемой памяти. Например:
$customers = Customer::find()->asArray()->all();
Спасибо за ответ и полезную информацию. Но я не использую объект ActiveRecord. А использую DB::createCommand, что в теории позволяет использовать чистый sql запросы, огромной вложенности и сложности. Но что-то пошло не так и используя это обертку, результатирующая таблица имеет дополнительный записи, как и почему появляющиеся я не знаю, а по ним уже идет подсчет и дальнейшая сортировка и вывод результата
Yaroslav
Сообщения: 7
Зарегистрирован: 2016.02.22, 19:29

Re: JOIN не корректно работает

Сообщение Yaroslav »

Так же, было предположение что встречая JOIN - YII2 использует OUTER JOIN, а не INNER JOIN. Но как проверить не знаю. В запросе явно указывал что это INNER JOIN, но опять же на вывод это не влияло.
Yaroslav
Сообщения: 7
Зарегистрирован: 2016.02.22, 19:29

Re: JOIN не корректно работает

Сообщение Yaroslav »

Yaroslav писал(а):Так же, было предположение что встречая JOIN - YII2 использует OUTER JOIN, а не INNER JOIN. Но как проверить не знаю. В запросе явно указывал что это INNER JOIN, но опять же на вывод это не влияло.
Проверил через консоль, и правый и левый и внутренний и внешний запросы. Не появляются дополнительные записи в и тоговой таблице, а в YII2 появляются и это влияет на результат. Могу предположить, что парсер для DB::createCommand - содержит ошибку, или внутрення логика JOIN содержит не стандартное поведение.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: JOIN не корректно работает

Сообщение Nerf »

Вот только ничего не парсится. Там используется "как есть".
Посмотрите в дебагере, какой точно запрос улетает в БД, и сравните с оригинальным.
Ответить