získání výstupu ze složitějšího mysql dotazu
- argosovo
- Člen | 54
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
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
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
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
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
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
„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
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();