Left join s ON … AND klauzulí

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

Pochopil jsem, že v NDB se nepoužívá nic jako join()

Potřeboval bych udělat dotaz, který mi vybere všechny týmy a spočítá, kolik je v nich potvrzených hráčů.

Funguje mi dotaz:

SELECT
    t.*,
    COUNT(s.id) as current_players
FROM
    team t
    LEFT JOIN squad s ON t.id = s.team_id AND s.accepted=1
GROUP BY
    t.id
ORDER BY current_players DESC

Zatim to mam takhle:

<?php
$result = $this->db->table('team')
->select('team.*, count(:squad.id) AS current_players')
->group('team.id');
?>

A to mi funguje kromě toho, že to bere všechny hráče a ne jen ty potvrzené.

Caine
Člen | 216
+
0
-

Tohle v ndbt nikdy nenapises:) Jen pres obyc ->query, coz ale nevraci ActiveRow

desss
Člen | 14
+
0
-

Ten můj kód mi generuje tenhle dotaz:

SELECT
    `team`.*,
    count(`squad`.`id`) AS `current_players`
FROM
    `team`
LEFT JOIN
    `squad` ON `team`.`id` = `squad`.`team_id`
GROUP BY
    `team`.`id`

což je vlastně skoro přesně to, co potřebuju, až na to „AND squad.accepted=1“ abych vybral všechny týmy, ale počítal k nim jen potvrzené hráče… možná by šlo změnit SQL dotaz, ale nevim jak

sKopheK
Člen | 207
+
0
-

Kdybys to poslal na http://sqlfiddle.com mohl bych se pokusit pomoci více, ale teď se musím omezit na tipování. Zkoušels tam přidat klauzuli WHERE?

$result = $this->db->table('team')
->select('team.*, count(:squad.id) AS current_players')
->where(':squad.accepted', TRUE)
->group('team.id');
desss
Člen | 14
+
0
-

Tak zatim takhle: http://sqlfiddle.com/#…

Ten where :squad.accepted mi způsobí, že se vypíšou jen týmy, které mají potvrzené hráče, ale já chci všechny týmy a počítat potvrzené hráče v nich

petr.pavel
Člen | 535
+
0
-
->where('(:squad.accepted IS TRUE) OR (:squad.id IS NULL)')

Ten odkaz na sqlfiddle je nějakej potentočkovanej.

duke
Člen | 650
+
0
-

Možná by šlo tam nějak propašovat COUNT s NULLIF funkcí. Něco jako:

...
	COUNT(s.id) as current_players,
	COUNT(NULLIF(s.accepted, 0)) as accepted_players
FROM
...
desss
Člen | 14
+
0
-

Na ten sqlfiddle buďto přes zdroj a nebo by to mělo být takhle: …fiddle.com/ # !2/514… (prostě ten křížek se nezobrazil ale musí tam být)

Myslim, že mi to funguje přes ten where :-) takže zatim díky