U Forpsi mysql hlásí chybu SQLSTATE[42000]: Syntax error or access violation: 1140

vanaveno
Člen | 144
+
+1
-

Ahojte, přesunul jsem jeden vytvořený web na forpsi, na mém serveru funguje na Forpsi mi to hlásí chybu

SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column ‚f144687.tags.tagId‘; this is incompatible with sql_mode=only_full_group_by

Pravděpodobně musím vypnout sql_mode=only_full_group_by, měl bych to udělat ještě před přihlášením do databáze.

Děkuji za pomoc

Mistrfilda
Člen | 76
+
+2
-

Ahoj,

jestli muzu poradit, tak bych spise nez resit, jak only_full_group_by vypnout, resil to, proc to vubec vznika. Doporucuju si o tom neco precist (treba https://www.percona.com/…by-sql-mode/ nebo z oficialni dokumentace https://dev.mysql.com/…ql-mode.html#…), jakym zpusobem to funguje, protoze to muze mit docela velky vliv na data, ktere dotazy vraci (chybna data). Pokud si ses naprosto jisty, ze select vraci spravne a vysledky, tak muzes zkusit pouzit misto globalniho vypnuti, funkci ANY_VALUE() – https://dev.mysql.com/…nctions.html#… popripade jakkekoliv jine agregacni funkce MIN() MAX() – s tim ale opravdu opatrne :)

vanaveno
Člen | 144
+
0
-

Mám to řešené pomocí Database Exploreru uložiště InnoDB akorát u toho forpsi nemůžu najít kde jsou geaficky zobrazeny ty propojené relace mezi tabulkami :(

vanaveno
Člen | 144
+
0
-

U Forpsi mi poradili toto:
https://support.forpsi.com/…roup-by.aspx

$spojeni = mysqli_connect( „server“, „login“, „heslo“, „databaze“ );
mysqli_query($spojeni, „SET sql_mode=(SELECT REPLACE(@@sql_mode,‚ONLY_FULL_GROUP_BY‘,''))“ );

Jak to mám prosím nastavit u připojení databáze. Používám Database Exploerer.

Děkuji

uestla
Backer | 796
+
0
-

Tohle by se dalo řešit pomocí $onConnect eventu, který je ještě o úroveň výše na Database Core, a volá se po úspěšném připojení k databázi:

$connection->onConnect[] = static function (Connection $connection): void {
	$connection->query('SET sql_mode = (SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""));');
};
vanaveno
Člen | 144
+
0
-

Díky! Kam to mám vložit?

uestla napsal(a):

Tohle by se dalo řešit pomocí $onConnect eventu, který je ještě o úroveň výše na Database Core, a volá se po úspěšném připojení k databázi:

$connection->onConnect[] = static function (Connection $connection): void {
	$connection->query('SET sql_mode = (SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""));');
};
David Grudl
Nette Core | 8082
+
+2
-

sql_mode se dá taky nastavit v konfiguraci:

database:
	options:
		sqlmode: ...
uestla
Backer | 796
+
+1
-

vanaveno napsal(a):

Díky! Kam to mám vložit?

Lepší možná bude si ten SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", "") pustit jednorázově na serveru a to, co ti to vrátí, pak použít v configu, jak psal @DavidGrudl výše.

Tedy např.

database:
	options:
		sqlmode: 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

Díky tomu to pak budeš mít srovnané na všech prostředích.

vanaveno
Člen | 144
+
0
-

Děkuji za pomoc a zároveň se omlouvám, protože problém byl někde jinde.

Vojtha
Člen | 36
+
0
-

Ahoj,

zkouším zapnout konfiguraci sqlmode, ale dostávám

Nette\DI\InvalidConfigurationException
Unexpected item 'database › options › sqlmode'. search►

Vypadá to, jako by byl problém někde v jádru nette, zkoušel jsem updatovat přes composer, ale nemělo to efekt. Netušíte někdo, kam se podívat? Díky.

mystik
Člen | 284
+
0
-

@Vojtha Neskladas tu konfiguraci z vice neon souboru? Je tam nejaka magie ktere resi transformaci hodnot v database do database>default a pak se to soatne posklada. Zkus pridat tu dalsi uroven s default.

Vojtha
Člen | 36
+
0
-

Tak ne, měl jsem tam špatně tabulátory :-). Ale stejně díky!