Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Проблема группировки в запросе

Опубликовано:

Добрый день, подскажите пожалуйста, в чем может быть проблема в запросе?

Делаю запрос

SELECT * FROM `rounds`  LEFT JOIN `matches` ON matches.match_id = rounds.match_id WHERE player_id=1 GROUP BY `rounds`.`match_id`

Таким образом (в файле расширения приложения)

$match_data = $match_connect->select
('*','rounds',array( 'player_id=?', 1 ), null,null,'rounds.match_id');
$match_data = $match_data->join( 'matches', 'matches.match_id = rounds.match_id', 'LEFT' );

в ответ выходит ошибка 

IPS \ Db \ Exception (1055)
'match.rounds.player_id' isn't in GROUP BY

Хотя при дебаге 

\file_put_contents( '/applications/appkey/logs'.'/test.log', "\n".print_r( $match_data , true )."\n\n" );

Запрос формируется корректно и нормально выполняется в стороннем клиенте Mysql

    [query] => SELECT * FROM `rounds`  LEFT JOIN `matches` ON matches.match_id = rounds.match_id WHERE player_id=? GROUP BY `rounds`.`match_id`
    [binds] => Array
        (
            [0] => 1
        )

 

Даже вне приложения, в тестовом файле запрос работает как надо

$match_data = $db_connect->select
('*', 'rounds',array( 'player_id=?', 1 ),null,null,'rounds.match_id');
$match_data = $match_data->join( 'matches', 'matches.match_id = rounds.match_id', 'LEFT' );

foreach ($match_data as $match)
{
  echo '<pre>';
  print_r($match);
  echo '</pre>';
}

 

Рекомендованные сообщения

Опубликовано:
  • Автор

При отключении DEV режима, всё срабатывает. Так понимаю, это из-за этого в /system/Db/Db.php

		/* Enable strict mode for IN_DEV */
		if ( \IPS\IN_DEV )
		{
			if( $read AND $this->connectionDetails['readDatabase'] )
			{
				$this->reader->query( "SET sql_mode='STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY,ANSI_QUOTES'" );
			}
			else
			{
				parent::query( "SET sql_mode='STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY,ANSI_QUOTES'" );
			}
		}

Подскажите пожалуйста, как в итоге собрать запрос, чтобы он корректно работал и в дев и в рабочей версии ?

Опубликовано:

Добрый день!

Да, тоже сталкивался с этим, единственное что могу предложить (вставить выше вашего запроса):

        if ( \IPS\IN_DEV ) {
            \IPS\Db::i()->query("SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));");
        }

Тут не идёт речи о правильности или идеальности, каждый совет и рекомендация как побороть эту ошибку носит ограниченный характер, я лично на свой страх и риск выбрал такое.

Опубликовано:
  • Автор

Спасибо за вариант решения!

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.