Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wybieranie rekordów o podobnych czasach z odchyleniem 5 sekund
Forum PHP.pl > Forum > Bazy danych > MySQL
Indruś
Witam, mam tabelę o nasepującej strukturze:

  1. CREATE TABLE `zjawiska` (
  2. `id_zjawiska` int(11) NOT NULL AUTO_INCREMENT,
  3. `kamera` int(11) NOT NULL,
  4. `data` datetime NOT NULL,
  5. `obrazek` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  6. `inf` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  7. `program` int(11) NOT NULL,
  8. `falszywka` tinyint(1) NOT NULL,
  9. PRIMARY KEY (`id_zjawiska`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci ;


W tabeli znajduje się standardowo koło 12000 rekordów, które są codziennie dodawane i usuwane.
Mój problem:
Jak wyłapać rekordy, które są podobne pod względem czasu (pole data) z odchyleniem +-5sekund.
i pogrupować je według pola data?
Riggs
  1. SELECT * FROM zjawiska WHERE `data`>= DATE_SUB($data_zjawiska, INTERVAL 5 SECOND) AND `data` <= DATE_ADD($data_zjawiska, INTERVAL 5 SECOND)

Pisane z palca, pogrupować później możesz tak jak chcesz.
Indruś
Dzięki, jednak niestety nie zupełnie mi o to chodziło. Nie mam mu podawać żadnej daty - on ma sam wszystkie możliwości wybrać. Może na podstawie danych będzie łatwiej:

Taki wykaz czasów:
10:12:11
10:33:50
10:30:14
11:30:26
11:06:23
10:33:54
11:30:25
10:33:48

Efektem zapytania ma być:

10:33:50
10:33:54
10:33:48

11:30:26
11:30:25

irmidjusz
Ciekawe zagadnienie. Udało Ci się coś zrobić?
Zacznijmy od tego, że jako wynik zapytania nie możesz dostać wiersza ze spacją wink.gif który rozdzielałby grupy. Zaproponuj, jakby to miało wyglądać biorąc pod uwagę rzeczywiste możliwości zwrócenia jakiegoś wyniku. Przykłady:

A)
id_grupy, czas
1, 10:33:50
1, 10:33:54
1, 10:33:48
2, 11:30:26
2, 11:30:25

B )
id_wierszy_z_czasami_w_jednej_grupie_rozdzielone_znakiem_podkreslenia wink.gif
2_6_8
4_7

(założyłem, że czas 10:12:11 ma id 1 a czas 10:33:48 ma id 8)

C) może utworzona inna tabela (tymczasowa?) do której byłyby wstawiane wiersze z id czasu (lub czasem) oraz numerem grupy?

D) inny sposób prezentacji wyniku?

Jak się do tego zabrać? Może najpierw pobrać czas minimalny, zwiększyć tą wartość o o połowę przedziału (czyli 2,5 sekundy) a następnie sprawdzać obecność rekordów z czasem w zakresie +-2,5 s od tej wartości, która w każdym kroku będzie zwiększana o 5 sekund aż do osiągnięcia czasu maksymalnego obecnego w tabeli?
Indruś
Cytat(irmidjusz @ 10.01.2014, 22:07:46 ) *
Ciekawe zagadnienie. Udało Ci się coś zrobić?

Mimo pozornej prostoty jednak jest to dość skomplikowane (przynajmniej jak dla mnie).
Moja wersja wyglda tak:
  1. SELECT DISTINCT a.id_zjawiska, b.nazwa_kamery, a.DATA, a.obrazek, a.inf, c.nazwa FROM zjawiska AS a, kamera b, programy c
  2. WHERE EXISTS
  3. SELECT id_zjawiska\n"
  4. FROM zjawiska AS Pole2\n"
  5. WHERE (Pole2.DATA BETWEEN a.data-INTERVAL 5 SECOND AND a.DATA + INTERVAL 5 SECOND)
  6. AND Pole2.id_zjawiska <> a.id_zjawiska AND Pole2.kamera <> a.kamera AND a.kamera=b.id_kamera AND a.program=c.id_prg
  7. ORDER BY a.DATA DESC

Niestety nie jest to doskonałe rozwiązanie, bo gubi mi część danych mieszczących się w zakresie.

Sposób dostarczania wyniku jest dla mnie obojętny. Korzystam z php więc najlepiej aby wynikiem był wiersz wg powyższego zapytania.

Jak się zabrać? Moja wizja jest taka:
1) Wybieramy wszystkie zjawiska z tabeli i nazywamy lista1
2) Duplikujemy lista1 do lista2
3) Tworzymy licznik i nadajemy mu wartość 0
4) Tworzymy pustą liste3 - będzie ona zawierać powtarzajace się dane
5) pobieramy element lista1[licznik]
6) w pętli sprawdzamy każdą wartość listy2 w poszukiwaniu czasu +-5 sekund od wartości z pkt. 5
7) jeżeli czas się mieści w kryterium wpisujemy do listy3 jednocześnie usuwając z listy2
8) zwiększamy licznik o 1
9) jeżeli licznik<liczby elementów lista1 wracamy do pkt. 5

Do tego jakby się udało zgrupować dane z lista3 wg wartości z lista1 to już byłby full wypas.

W php bym to napisał, jednak chodzi o wydajność, więc wypada zaprzęgnąć do tego mysql.

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.