[NDBT] Alternativa ke COUNT(:related_table.*)

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

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
+
0
-

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
+
0
-

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
+
0
-

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)