Ja z tego zrobić jedno zapytanie SQL?

Witam. Zrobiłam projekt bazy danych - plan lekcji w szkole. Baza w db2 interfejs w php/html.

I nie wiem jak teraz zrobić zapytanie : ilu uczniów było w klasie… ( np.I) na lekcji (np. Biologii)… w godzinach…(od…do…) … w dniu ( np. we wtorek). poniżej wklejam tekst źródłowy:


– Tabela “Przedmioty”


CREATE TABLE Przedmioty (

IDPrzedmiot INTEGER NOT NULL,

Nazwa VARCHAR(40),

CONSTRAINT PK_Przedmioty PRIMARY KEY (IDPrzedmiot)

);


– Tabela “Nauczyciel”


CREATE TABLE Nauczyciel (

IdNauczyciela INTEGER NOT NULL,

Imie VARCHAR(40),

Nazwisko VARCHAR(40),

CONSTRAINT PK_Nauczyciel PRIMARY KEY (IdNauczyciela)

);


– Tabela “Sale”


CREATE TABLE Sale (

IDSale INTEGER NOT NULL,

Nazwa VARCHAR(40),

CONSTRAINT PK_Sale PRIMARY KEY (IDSale)

);


– Tabela “Klasy”


CREATE TABLE Klasy (

IdKlasa INTEGER NOT NULL,

Nazwa VARCHAR(40),

CONSTRAINT PK_Klasy PRIMARY KEY (IdKlasa)

);


– Tabela “Plan”


CREATE TABLE Plan (

IDPlan VARCHAR(40) NOT NULL,

IDSale INTEGER,

IdKlasa INTEGER,

Dzien DATE,

GodzinaOd TIME,

GodzinaDo TIME,

IDNauczPrzed INTEGER NOT NULL,

CONSTRAINT PK_Plan PRIMARY KEY (IDPlan)

);


– Tabela “NauczPrzed”


CREATE TABLE NauczPrzed (

IDNauczPrzed INTEGER NOT NULL,

IdNauczyciela INTEGER NOT NULL,

IDPrzedmiot INTEGER NOT NULL,

CONSTRAINT PK_NauczPrzed PRIMARY KEY (IDNauczPrzed)

);


– Tabela “Uczniowie”


CREATE TABLE Uczniowie (

IdUczen INTEGER NOT NULL,

Imie VARCHAR(40),

Nazwisko VARCHAR(40),

IdKlasa INTEGER NOT NULL,

CONSTRAINT PK_Uczniowie PRIMARY KEY (IdUczen)

);


– Klucze obce


ALTER TABLE Plan ADD CONSTRAINT Sale_Plan

FOREIGN KEY (IDSale) REFERENCES Sale (IDSale);

ALTER TABLE Plan ADD CONSTRAINT Klasy_Plan

FOREIGN KEY (IdKlasa) REFERENCES Klasy (IdKlasa);

ALTER TABLE Plan ADD CONSTRAINT NPP

FOREIGN KEY (IDNauczPrzed) REFERENCES NauczPrzed (IDNauczPrzed);

ALTER TABLE NauczPrzed ADD CONSTRAINT Nauczyciel_NauczPrzed

FOREIGN KEY (IdNauczyciela) REFERENCES Nauczyciel (IdNauczyciela);

ALTER TABLE NauczPrzed ADD CONSTRAINT PNP

FOREIGN KEY (IDPrzedmiot) REFERENCES Przedmioty (IDPrzedmiot);

ALTER TABLE Uczniowie ADD CONSTRAINT KU

FOREIGN KEY (IdKlasa) REFERENCES Klasy (IdKlasa);

Jeśli ktoś potrafi mi pomóc i to napisać w sql będę bardzo wdzięczna. Czy w ogóle jest to możliwe żeby zrobić to w jednym zapytaniu?

Z góry dziekuję za pomoc i wszystkie sugestie z waszej strony.

Pozdrawiam serdecznie i czekam na Waszą pomoc :slight_smile:

W tych tabelach nie widzę listy obecności. Widzę tylko przepisanie ucznia do klasy. Czyli w przypadku takiej organizacji bazy danych nie da się zrobić zapytania odpowiadającego na pytanie: “ilu uczniów było w klasie na lekcji …”, co najwyżej: “ile uczniów przypisano do KLAS które odbywali zajęcia z przedmiotu … w godzinach od … do … w dniu …”.

faktycznie,masz rację źle sprecyzowałam pytanie… dziękuję :slight_smile: ale czy możesz mi w takim razie pomóc? czyli zapytanie typu; ile uczniów przypisano do KLAS które odbywali zajęcia z przedmiotu … w godzinach od … do … w dniu …".

Spróbuj

SELECT COUNT(IdUczen) FROM Uczniowie, Plan WHERE Plan.IDKlasa = jakas_klasa AND Plan.Dzien = 'jakaś_data' AND Plan.GodzinaOd = 'jakaś_godz' AND Plan.GodzinaDo = 'jakaś_godz'

Warto dodać też listę obecności, w powyższym zapytaniu otrzymujemy liczbę osób w danej klasie

SELECT (U.IdUczen)FROM , NauczPrzed N, Plan P, Klasy K, Uczniowie U

witajcie!

Temat powraca, gdyż zaproponowane przez Was rozwiązania nie do konca są dobre tzn . brakuje powiązań pomiędzy tabelami. Nie wiem czy nie chodzi czasem, zeby zastosować sumę albo iloczyn??? kto mi pomoże? będę bardzo wdzięczna! !!

Dodane 06.05.2010 (Cz) 14:58

jak-zrobic-tego-jedno-zapytanie-sql-t293217.html#p1957319

Skąd wniosek że to nie działa?

to może jeszcze doprecyzuje. Pracuję na bazie db2 i projekt ten też ładnie mi w niej działa. zapytanie które ostatecznie wygląda tak :

db2 => select count(iduczen) from uczniowie,plan,nauczprzed,przedmioty where plan.dzien = ‘2005-12-11’ and plan.godzinaod = ‘11:00’ and plan.godzinado = ‘12 :00’ and przedmioty.nazwa = ‘biologia’ to zwraca mi odpowiedz tylko ,ze podobno można powiązać ze sobą tabele tak aby nie używać przecinków. Myślałam o NATURAL JOIN ale to mi już kompletnie nie działa i tak sie zastanawiam, czy można to zapytanie ( jego składnie) jeszcze skonstruować inaczej.

to co podałaś nie może zadziałać ponieważ w tym zapytaniu brak jakiegokolwiek powiązania pomiędzy tabelami:

uczniowie - z której zliczasz iduczen

plan - w klauzule where

przedmioty - w klauzule where

Wiec poniżej mam trzy propozycje które będą działać z dokładnie takim samym skutkiem jak twój przykład:

select;

sdfghkldfj;

count(x);