Ja z tego zrobić jedno zapytanie SQL?


(Anetad25) #1

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:


([alex]) #2

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 ...".


(Anetad25) #3

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 ...".


(Foxco77) #4

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


([alex]) #5
SELECT (U.IdUczen)FROM , NauczPrzed N, Plan P, Klasy K, Uczniowie U

(Anetad25) #6

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


([alex]) #7

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


(Anetad25) #8

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.


([alex]) #9

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);