IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Problém s GROUP BY po prechode na MySQL 5.7

Aktivity
Avatar
Miroslav Tomašovič:5.8.2018 17:07

Ahojte. Po zmene MySQL databázy môjho webu na verziu 5.7 mám problémy s GROUP BY, konkrétne sa mi zobrazuje toto chybové hlásenie:

1055: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'databaza.Cube­Cart_cats_idx­.cat_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_fu­ll_group_by

Týka sa to tejto časti php kódu môjho webu:

if (isset($_GET['catId']) && $_GET['catId'] > 0) { Cats ($where_prod, $db->mySQLsafe($_GET['catId'])); }
$where_prod .= ") GROUP BY ".$glob['dbprefix']."CubeCart_cats_idx.productId";

Do MySQL a PHP sa veľmi nevyznám, je nejaká jednoduchá možnosť ako "vypnúť" ONLY_FULL_GROUP_BY, teda aby sa GROUP BY správal ako doteraz?

Ďakujem.

 
Odpovědět
5.8.2018 17:07
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.8.2018 15:25

On nikdo nereaguje, protoze nechape dotaz.
To php, to je tam krasna vec, ale lidi, co delaji s sql rozumi sql dotazum ne php. zkus udelat v tom php echo toho dotazu a ten sem pak zkopiruj. Ta chybova hlaska se tyka toho dotazu a v tomhle kodu nemas 80% dotazu.

Mam pocit, ze by mohl byt problem v tom, ze sloupce, ktere mas za GROUP BY je treba mit jeste v SELECT (ale to je asi blbost) nebo mozna WHERE. Jakoze ty sloupce, ktere jsou v group by musi byt jmenovane i ve where (nebo selectu). Mozna se da zmenit nejake nastaveni sql, ze to samo doplnuje, proto ti to jinde fungovalo, nevim.

'databaza.Cube­Cart_cats_idx­.cat_id' - Takovyto string v tom kodu, co jsi poslal, nikde nevidim.
".$glob['dbpr­efix']."CubeCar­t_cats_idx.pro­ductId - to jejspis vyplodi...
'databaza.Cube­Cart_cats_idx­.productId' - ale, to je preci neco jineho

Editováno 15.8.2018 15:26
 
Nahoru Odpovědět
15.8.2018 15:25
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na Miroslav Tomašovič
David Hynek:15.8.2018 17:35

nemela by tam byt mezera u posledniho kousku retezce? tedy " Cube..." ?

Nahoru Odpovědět
15.8.2018 17:35
Čím víc vím, tím víc věcí nevím.
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na David Hynek
Peter Mlich:16.8.2018 9:22

To taky nechapu :) Ale to je u mne normalni stav :)

Sql dotazy lze napsat takto:
SELECT sloupec FROM tabulka
SELECT tabulka.sloupec FROM tabulka
SELECT databaze.tabul­ka.sloupec FROM databaze.tabulka

Kdyz pise, ze neni agregovany, tak ten sloupec existuje, takze upravovat ten text mezerou navic by nemelo asi nic zmenit. Ale jen hadam :)
databaza.Cube­Cart_cats_idx­.cat_id

Si myslim, ze bude lepsi opravit sql dotazy nez resit zapinani nejakeho modu.
Mohlo by to jit zapnout nejakym sql prikazem. To by se dalo najit asi googlem. Ale az s tim bude delat cary mary priste, tak se znovu bude ptat. A treba ten mod uz nepujde prepinat.

 
Nahoru Odpovědět
16.8.2018 9:22
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na Peter Mlich
David Hynek:16.8.2018 14:13

Chybí mu tam tečka

") GROUP BY ".$glob['dbprefix'].".CubeCart_cats_idx.productId";

Chtěl jsem napsat tečka a napsal mezera a už mi to nechtělo povolit opravu... (asi odpolední únava)

Předpokládám že má toto:

$glob['dbprefix'] = "databaze";

Takže spojením řetězců má jen:

"databazeCubeCart_cats_idx.productId"
Editováno 16.8.2018 14:15
Nahoru Odpovědět
16.8.2018 14:13
Čím víc vím, tím víc věcí nevím.
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na plelovsky
Peter Mlich:21.8.2018 15:02

Hele, mimochodem, doporucuji k linkum kopirovat i reseni. Kdyz ten link prestane fungovat, tak je ta odpoved neuzitecna. Pokud ne uplne vse, tak aspon trochu, naznacit.

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Z tohoto se uz da celem poznat, ze se jedna o query, ktere staci zadat pred tim, nez zavola ten jeho nebo hned po pripojeni k db. Osobne se mi ho nechtelo googlovat, sam to nepouzivam.

 
Nahoru Odpovědět
21.8.2018 15:02
Avatar
plelovsky
Člen
Avatar
Odpovídá na Peter Mlich
plelovsky:21.8.2018 15:34

On to chce vypnout, ne nastavit.

 
Nahoru Odpovědět
21.8.2018 15:34
Avatar
Petr Lipovský:24.9.2021 21:06

Také jsem na to narazil.
V phpMyAdmin vybrat localhost, proměnné, nalézt sql mode a zde odstranit tuto část řetězce (viz obrázek)
Na hostingu to pravděpodobně půjde jen sql příkazy, ale nemám odzkoušené.
SET global sql_mode=(SELECT REPLACE(@@sql_mode, ‘ONLY_FULL_GRO­UP_BY’, ”)); - toto by mělo u řetězce odstranit jen tuto část.
Odkaz: "":https://w3site.ca/…ysql-5-7-28/

 
Nahoru Odpovědět
24.9.2021 21:06
Avatar
Petr Lipovský:27.9.2021 11:23

Ještě doplnění předchozího. Na localhostu se Vám to povede ale po restatu db se to musí provést znovu.
Na hostingu to nemusí být umožněno (změna proměnné a ani příkaz se slovem global.)
Nakonec funguje výše uvedený příkaz SET sql_mode=(SELECT REPLACE(@@sql_mode, ‘ONLY_FULL_GRO­UP_BY’, ”))
Nesmí tam být uvedeno global, naopak by tam místo global mohlo být SESSION.
Tento příkaz dát do php např. po vytvoření conectivity na db. Např:

$db = new PDO('mysql:hos­t=localhost;dbna­me=jmeno_db;char­set=utf8', 'jmeno', 'heslo');
$db->exec("SET sql_mode=(SELECT REPLACE(@@sql_mo­de,'ONLY_FULL_GRO­UP_BY',''))");

 
Nahoru Odpovědět
27.9.2021 11:23
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.9.2021 14:55

tema z roku 2018...

 
Nahoru Odpovědět
27.9.2021 14:55
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.