získání výstupu ze složitějšího mysql dotazu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
argosovo
Člen | 54
+
0
-

Ahoj, potřeboval bych rychlou radu – po mnoha omylech jsem složil správný sql dotaz, který po spuštění v admineru zobrazí výstup selectu takový jaký bych potřeboval(tedy z řádků jedné tabulky udělá sloupce výsledného selectu a hodnoty těchto sloupců doplní ze třetí tabulky, to celé napojí na tabulku hlavní). Bohužel když celou věc spustím přes Nette\Database a fetchAll() skončí Nette chybou, předpokládám, že jde o to, že Nette neví, u které části bych chtěl provést fetchAll():
PDOException #HY000 SQLSTATE[HY000]: General error.

Pro ukázku zmíněný kus kódu:

$vysledek=$this->db->query("SET group_concat_max_len = 4096;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
‚MAX(IF(vlastnost_typ.ID = ', ID, ',hodnota,NULL)) AS ', `nazev,‘` '
)) INTO @dotaz
FROM vlastnost_typ;

SET @dotaz = CONCAT(‚SELECT inzerat.*,ID_inzerat, ', @dotaz, '
FROM inzerat_has_vlastnost
LEFT JOIN vlastnost ON inzerat_has_vlastnost.ID_vlastnost=vlastnost.ID
LEFT JOIN vlastnost_typ ON vlastnost.ID_typ=vlastnost_typ.ID
LEFT JOIN inzerat ON inzerat.ID = ID_inzerat
GROUP BY ID_inzerat „.$where.“ LIMIT „.$limit.“‘);
PREPARE stmt FROM @dotaz;
EXECUTE stmt;");
$vysledek->fetchAll();

pomůže někdo dobrou radou? Děkuji

James_Scott
Člen | 55
+
-5
-

Nejsem zrovna DB expert, ale řekl bych, že na tyto účely není Nette\Database stavěno…
Použil bych Dibi nebo nějaký jiný ORM.

japlavaren
Člen | 404
+
+2
-

Strelím – máš v query 2 dotazy. Prvý nastavuje nejakú konfiguráciu a druhý má niečo vrátiť. Rozdeľ to na 2 query. Z bezprčnostních dovodov je zakázané odpáliť 2 query v jednom dotaze naraz.

argosovo
Člen | 54
+
0
-

Děkuji, obě dvě připomínky byly podnětné – po rozdělování dotazu a stále přebývající nefunkčnosti, jsem se podíval na Dibi a konečně se donutil najít to správné nastavení aby dibi začalo v nette fungovat (jsem opravdu začátečník), potom jsem začal experimentovat s dibi a našel metodu test(@query), která vypíše dotaz a zjistil jsem, že problém vzniknul až na konci dotazu kde jsem měl za sebou 2× uvedený LIMIT (jeden v dotazu a druhý v předávané proměnné, když jsem hledal ten optimální dotaz nijak jsem to samozřejmě neomezoval a tohle vzniklo až úplně nakonec) – tedy chybná syntaxe.

Po opravě mi to nedalo a vše jsem znovu překlopil na Nette\Database – musím říct že Databbase s tím má prostě problém, píše mi chybu o zdvojeném názvu column, jde sice o těžký dotaz, ale na 90% jsem si jist(i dle výpisu z adminer) že tam žádné políčko není 2×. Dibi si s tím popradilo jako nic a vrací správný dotaz, tedy až na to, že se musím naučit jak tam vtěsnat WHERE a LIMIT ;).
Ještě jednou děkuji

argosovo
Člen | 54
+
0
-

Děkuji za odpověď, nakonec v kombinaci s druhou odpovědí rozfungováno, popis je kdyžtak v druhé odpovědi. Vlastně k tomu mám ještě jeden poznatek, teď po chvíli co to zkouším – nejdřív musí přece přijít WHERE, potom GROUP BY a teprve potom LIMIT – vše funguje jak má

Editoval argosovo (23. 11. 2014 11:59)

japlavaren
Člen | 404
+
0
-

ja už by som do dibi nešiel. nieje dovod. večšinu z toho zvláda nette database. akú chybu nad stĺpcom ti to píše?

argosovo
Člen | 54
+
0
-

„Found duplicate columns in database result set.“ jenže z Nette\Database nejsem schopný dostat ten výsledný dotaz :-( volání $vysledek=$this->db->query(„EXECUTE stmt;“)->getSql(); skončí jako Call to undefined method Nette\Database\ResultSet::getSql(); takže při takhle složitém dotazu který neproběhne a neobjeví se v Laděnce nejsem schopný zjistit co se stalo, Dibi ten samý kód(měním jen ->db→ a ->dibi→ část ve volání) provede a vrátí správný výsledek.

japlavaren
Člen | 404
+
0
-

podľa tej tvojej chyby tam máš rovnaké stĺpce z viacerých tabuliek a čudujem sa, že to v dibi funguje (pretože toto je chyba priamo z databázy, nie z nette database)

na zistenie query použi $this->db->query(„…“)->getQueryString();