Diskuze: SELECT

Ostatní jazyky SQL SQL a databáze SELECT

Avatar
tondovo
Člen
Avatar
tondovo:

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:

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:

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í
+1 bodů
Ř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:

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

Nahoru Odpovědět  -3 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:

Děkuji oběma za pomoc.

 
Nahoru Odpovědět 27.3.2015 19:24
Avatar
naja_adamova
Člen
Avatar
Odpovídá na Michal Štěpánek
naja_adamova:

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 naja_adamova
Michal Štěpánek:

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 naja_adamova
Michal Štěpánek:

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 naja_adamova
Michal Štěpánek:

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 naja_adamova
Michal Štěpánek:

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
naja_adamova
Člen
Avatar
Odpovídá na Michal Štěpánek
naja_adamova:

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 naja_adamova
Michal Štěpánek:

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 naja_adamova
Michal Štěpánek:

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.