Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
tondovo
Člen
Avatar
tondovo:26.3.2015 9:52

Ahoj,
potřebuju poradit se selectem. Mám dvě tabulky v relaci 1:N
Tabulka akce a tabulka s přihlášenými účastniky na jednotlivé akce. Na každou akci je omezený počet účastníků. Následující dotaz mi vypíše pouze akce, na které je přihlášen alespoň jeden člověk. A já potřebuju vypsat všechny.

SELECT ucastnik.akce_id, COUNT(ucastnik­.akce_id) AS pocet_prihlasenych, max_pocet, (max_pocet - COUNT(ucastnik­.akce_id)) AS pocet_volnych_mist
FROM ucastnik LEFT JOIN akce
ON ucastnik.akce_id = akce.id
GROUP BY(akce_id)

Díky za pomoc

 
Odpovědět
26.3.2015 9:52
Avatar
Odpovídá na tondovo
Michal Štěpánek:26.3.2015 10:46

Místo LEFT JOIN použij RIGHT OUTER JOIN

Nahoru Odpovědět
26.3.2015 10:46
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Honza
Člen
Avatar
Honza:26.3.2015 11:38

Podle mě by mělo stačit prohodit tabulky akce a ucastnik.

Když místo: FROM ucastnik LEFT JOIN akce
Dáš: FROM akce LEFT JOIN ucastnik

mělo by ti to dotáhnout všechny akce z tabulky akcí a pokud je někdo přihlášen, dotáhne i přihlášené uživatele.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
26.3.2015 11:38
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:26.3.2015 12:31

Když použiješ LEFT JOIN, tak se zobrazí pouze ty řádky, kde jsou nějaké hodnoty u obou tabulek...

Nahoru Odpovědět
26.3.2015 12:31
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
tondovo
Člen
Avatar
Odpovídá na tondovo
tondovo:27.3.2015 19:24

Děkuji oběma za pomoc.

 
Nahoru Odpovědět
27.3.2015 19:24
Avatar
Lenka
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
Lenka:31.3.2015 22:13

To není pravda.
LEFT JOIN i RIGHT JOIN jsou implicitne vnejsi.
U LEFT JOIN se vyuziji i ty radky z leve tabulky, ktere nemaji v prave souvisejici data. Obdobne RIGHT JOIN.

Pravda je v předchozích dvou příspěvcích, které říkají ve své podstatě totéž.

 
Nahoru Odpovědět
31.3.2015 22:13
Avatar
Odpovídá na Lenka
Michal Štěpánek:31.3.2015 22:26

Ano, napsal jsem to špatně, měl jsem tam dopsat INNER. Pokud použiju OUTER dostanu všechna data, která chci.

Nahoru Odpovědět
31.3.2015 22:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Lenka
Michal Štěpánek:31.3.2015 22:46

No nevím, ale LEFT JOIN je zcela určitě implicitně INNER... a to podle mě není vnější. A když zkusím napsat do dotazu RIGHT JOIN, tak mi vynadá, že musím dopsat, jestli má být INNER, nebo OUTER. A Abych pravdu řekl RIGHT INNER JOIN jsem nikdy nezkoušel použít, když jsem dával RIGHT, tak vždycky OUTER...

Nahoru Odpovědět
31.3.2015 22:46
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Lenka
Michal Štěpánek:31.3.2015 23:33

Přesně tak, cituji z toho článku:
"Pokud uvedeme v SQL dotazu pouze JOIN, pokládá ho MS-SQL databáze za tzv. INNER JOIN. Pokud by v našem případě neexistoval uživatel s id, které je u článku uvedeno, článek bez uživatele by vůbec nebyl ve výsledcích obsažen."

Nahoru Odpovědět
31.3.2015 23:33
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Lenka
Michal Štěpánek:31.3.2015 23:37

Už jsem si na mnoha aplikacích vyzkoušel, že když uvedu LEFT JOIN je automaticky brán jako INNER...

Nahoru Odpovědět
31.3.2015 23:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Lenka
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
Lenka:31.3.2015 23:42

Jenze to plati jen u samotneho JOIN - ten je fakt vnitrni.
Mrkni na podkapitolky LEFT OUTER JOIN,RIGHT OUTER JOIN a v nich uvedene priklady v nichz jiz OUTER nefiguruje a funguji opravdu dle popisu (v minulosti vyzkouseno).

 
Nahoru Odpovědět
31.3.2015 23:42
Avatar
Odpovídá na Lenka
Michal Štěpánek:31.3.2015 23:58

Já mám vyzkoušeno, že když neuvedu vysloveně OUTER, bere mi LEFT JOIN jako INNER

Nahoru Odpovědět
31.3.2015 23:58
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Lenka
Michal Štěpánek:1.4.2015 0:05

Máš pravdu, já vždycky píšu jen INNER JOIN, nikoliv LEFT JOIN...

Nahoru Odpovědět
1.4.2015 0:05
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.