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
Tomáš Hanzelka:14.11.2018 19:24

Něco mám v mém příkaze špatně. Nedokážu nějak pochytit jak mám zapsat podmínku nebo když musím používat jak having tak where (viz. zadání a obrázek)

Zkusil jsem: select p.Nazev, p.PredmetID from Predmet p
inner join Zapis z on
p.PredmetID = z.PredmetID
where Mistnost like '52%'
group by p.Nazev, p.PredmetID
having COUNT(z.StudentID) >= 1

Chci docílit: Zadání zní: Vypište seznam všech předmětů, které se učí v místnosti „51-107“ nebo je na ně zapsán alespoň 1 student.

 
Odpovědět
14.11.2018 19:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.11.2018 8:33

'Vypište seznam všech předmětů, které se učí v místnosti '
To pracujes s tabulkou kde je jen id_predmet a id_mistnost, rekneme, ze se jmenuje zapisy. Ostatni informace si pridas z dalsich tabulek

SELECT z.id_mistnost, z.id_predmet, z.id_student,
                m.kod AS mist_kod, m.nazev AS mist_nazev,
                p.kod AS pred_kod, p.nazev AS pred_nazev,
                s.jmeno, s.prijmeni
FROM   zapisy z
                 LEFT JOIN mistnosti m ON m.id_mistnost = z.id_mistnost
                 LEFT JOIN predmety  p ON p.id_predmet  = z.id_predmet
                 LEFT JOIN studenti  s ON s.id_student  = z.id_student
WHERE  m.kod='51-107'

zapisy
id_mistnost, id_predmet, id_student
3, 7, 56

mistnosti
id_mistnost, kod, nazev
7, 'b1', 'laborator chemie'

predmety
id_predmet, kod, nazev
3, 'cjl', 'cesky jazyk a literatura'

studenti
id_student, jmeno, prijmeni
56, 'tomas', 'popelka'

Zobrazi to vsechny studenty, kteri jsou zapsani v mistnosti. Takze to pak staci grupovat podle mistnosti a predmetu a odpojit od toho tabulku studenti, protoze te nezajima.

Editováno 15.11.2018 8:35
 
Nahoru Odpovědět
15.11.2018 8:33
Avatar
Tomáš Hanzelka:15.11.2018 10:53

Díky a kde je ta druhá podmínka "nebo je na něj zapsán aspoň jeden student"?
Jak pro lepší komunikaci, první tabulka je tabulka "Predmet", ta pod ní "Zapis".

 
Nahoru Odpovědět
15.11.2018 10:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.11.2018 11:08

Prepokladam, ze princip je takovy, ze studenti s zapisuji do rozvrhu predmety. Student pri zapise vytvori zaznam

zapisy
id_mistnost, id_predmet, id_student
3, 7, 56

Z toho plyne, ze kazdy radek z tabulky zapisy odpovida stavu aspon 1 student.

Ty to delas prave opacne. Ty si oteviras tabulku predmety, kde mas i predmety, ktere nikdo nema zapsane.
Ja si oteviram primo zapsane predmety a a temto zapsanym donacitavam dalsi informace z jinych tabulek pres left join.
Nebo, mas nejaky duvod, proc to delas tak, jak to delas? Zadani od ucitele?

Editováno 15.11.2018 11:08
 
Nahoru Odpovědět
15.11.2018 11:08
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.11.2018 11:19

Ikdyz, mozna to tvoje udela totez, jak tak koukam na tutorialpoint :) INNER JOIN nepouzivam. U LEFT JOIN zalezi na poradi, co k cemu pripojujes. To tam je krasne videt, kdyz tam data bere podle tab. customers a ne podle tab. order, tak je tam spoustu radku s null udaji.
https://www.tutorialspoint.com/…er-joins.htm
https://www.tutorialspoint.com/…ft-joins.htm

 
Nahoru Odpovědět
15.11.2018 11:19
Avatar
plelovsky
Člen
Avatar
plelovsky:15.11.2018 15:57
SELECT p.*
FROM
    Predmet p
    LEFT OUTER JOIN (
           SELECT PredmetID, COUNT(*) AS Pocet
           FROM Zapis
           GROUP BY PredmetID
    ) z ON z.PredmetID = p.PredmetID
WHERE
    p.Mistnost = '51-107'
    OR
    z.Pocet > 0

HAVING tam k ničemu nepotřebuješ.

 
Nahoru Odpovědět
15.11.2018 15:57
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 6 zpráv z 6.