Jak wyznaczyć np. Kolejne – następujące po sobie – wizyty zwierzęcia w lesie w tej bazie danych:
Zapytaniem :)
Na moje oko coś takiego wystarczy:
select gz.nazwa gatune_zwierzaka, l.nazwa nazwa_lasu, zl.data data_wystapienia
from zwierze_las zl, las l, zwierze z, gatunek_zwierze gz
where zl.id_lasu = l.id_lasu
and zl.id_zwierzecia = z.id_zwierzecia
and z.id_gatunku = gz.id_gatunku
order by zl.data desc
lub jak kto woli z inner joinami
select gz.nazwa gatune_zwierzaka, l.nazwa nazwa_lasu
from zwierze_las zl
left join las l on zl.id_lasu = l.id_lasu
left join zwierze z on zl.id_zwierzecia = z.id_zwierzecia
left join gatunek_zwierze gz on z.id_gatunku = gz.id_gatunku
order by zl.data desc
Pisane z głowy jak się nie odpali to sorki ale trzeba było przygotować strukturę na http://sqlfiddle.com/
Na razie mam takie coś:
SELECT data
FROM Zwierze_Las INNER JOIN Zwierze
ON Zwierze_Las.id_zwierzecia = Zwierze.id_zwierzecia
ORDER BY data DESC
Jeśli jeszcze dojdzie taki warunek: Liczba tych wizyt, gdy w międzyczasie żadne inne zwierzę danego lasu nie odwiedzało. Jak napisać ten warunek?
A propos twojego pytania z komentarza jak rozumiem chcesz wyciągnąć wizyty gdzie tylko 1 zwierzak w danym czasie się znajdował w danym lesie i ile ich było. W zależności od dystrybucji bazy danych zapytanie może wyglądać nieco inaczej (bo np w mysql nie trzeba pamiętać o warunkach w GROUP BY). W każdym razie najprościej jak mi się to nasuwa w danym momencie to użycie COUNT(*) do wyciągnięcia ilości, GROUP BY do grupowania wyników i funkcji NOT EXISTS w oparciu o datę. Nie będzie to najwydajniejsze rozwiązanie ale da ono oczekiwany rezultat.
Co do pierwszego zadania, czy te rozwiązanie jest poprawne? Bo trochę inaczej je zrobiłem niż wyżej.
SELECT zl.id_zwierzecia, l.nazwa
FROM zwierze_las zl INNER JOIN las l
ON zl.id_lasu = l.id_lasu
RIGHT JOIN Zwierze z
ON z.id_zwierzecia = zl.id_zwierzecia
INNER JOIN Gatunek_Zwierze gz
ON gz.id_gatunku = z.id_gatunku
Nie mam pomysłu co do tego warunku, że w międzyczasie żadne inne zwierzę danego lasu nie odwiedzało.
Mam coś takiego:
SELECT zl.id_zwierzecia, l.nazwa, count(zl.id_zwierzecia)
FROM zwierze_las zl INNER JOIN las l
ON zl.id_lasu = l.id_lasu
RIGHT JOIN Zwierze z
ON z.id_zwierzecia = zl.id_zwierzecia
INNER JOIN Gatunek_Zwierze gz
ON gz.id_gatunku = z.id_gatunku
WHERE NOT EXISTS
Jeszcze takie jedno zadanie:
Liczba leśniczych, którzy opiekowali się wybranym lasem.
O jaki ja jestem biedny ... kolego może rozejrzyj się za jakimś korepetytorem z SQL jeśli chcesz zaliczyć ten przedmiot?
Na moje oko to coś takiego:
SELECT zl.id_zwierzecia, l.nazwa, COUNT(zl.id_zwierzecia)
FROM zwierze_las zl
INNER JOIN las l ON zl.id_lasu = l.id_lasu
RIGHT JOIN Zwierze z ON z.id_zwierzecia = zl.id_zwierzecia
INNER JOIN Gatunek_Zwierze gz ON gz.id_gatunku = z.id_gatunku
WHERE NOT EXISTS (select 1 from zwierze_las zle where zle.id_zwierzecia <> zl.id_zwierzecia and zle.data = zl.data)
GROUP BY zl.id_zwierzecia, l.nazwa
Oczywiście nie sprawdzałem bo nie mam schematu.