[NDBT] Alternativa ke COUNT(:related_table.*)
- CZechBoY
- Člen | 3608
Zdravím,
narazil jsem na velkou nepříjemnost u MySQL (nevím jak
u ostatních db).
Vygenerované SQL
SELECT *
FROM table
LEFT JOIN related_table ON table.id = related_table.id
ORDER BY COUNT(related_table.*)
mi neprojde a padne na chybě
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) ASC LIMIT 20' at line 1
Řešením by bylo v knihovně dát pryč related_table. z COUNT a nechat tam pouze hvězdičku, join ponechat.
Co myslíte?
Nějaké lepší/normální řešení?
Díky
- h4kuna
- Backer | 740
A můžeš nějak docílit toho, aby tam nebyla ta hvězdička, ale třeba sloupeček id?
SELECT *
FROM table
LEFT JOIN related_table ON table.id = related_table.id
ORDER BY COUNT(related_table.id)
Pokud to bude dávat relevantní výsledky. Sloupeček id nesmí být NULL, pak to bude dávat stejné výsledky.
Editoval h4kuna (31. 7. 2015 8:19)
- CZechBoY
- Člen | 3608
Bohužel primární klíč je složený ze dvou sloupců – ať dám jakýkoliv jeden sloupec tak to bude počítat špatně :(
Zatím jsem to vyřešil vyjmenovanim sloupců do select a 2× group by. Toto řešení se mi nelíbí, protože musím uvádět všechny sloupce.
Samozřejmě můžu použít related->count v customRender (používám o5/grido), ale to bych přišel o možnost řazení.
- CZechBoY
- Člen | 3608
Zatím jsem došel k následujícímu řešení:
$db
->select('(SELECT COUNT(*) FROM related_table WHERE `related_table`.id = table.id) count')
->select('table.*');
Nevím jak jinak si vynutit, aby ndt neparsovalo subselect a nehledalo tam tabulky ke spojení. Tak jsem tam dal zpětné apostrofy – což je řešení pouze pro MySQL a já potřebuji, aby aplikace jela i na Oraclu.
Nějaké nápady, jak se dostat k Database\ISupplementalDriver->delimite?
Editoval CZechBoY (31. 7. 2015 15:41)