Wyznaczanie kolejnych wizyt w bazie danych

0

Jak wyznaczyć np. Kolejne – następujące po sobie – wizyty zwierzęcia w lesie w tej bazie danych:

0

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/

0

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
0

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?

0

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.

0

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
0

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
0

Jeszcze takie jedno zadanie:

Liczba leśniczych, którzy opiekowali się wybranym lasem.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1