Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wybieranie rekordów o podobnych czasach z odchyleniem 5 sekund
Indruś
post 6.12.2013, 13:15:40
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.12.2013

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Riggs
post 10.12.2013, 12:42:55
Post #2





Grupa: Zarejestrowani
Postów: 162
Pomógł: 13
Dołączył: 16.06.2007

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
Indruś
post 10.01.2014, 16:45:45
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.12.2013

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
irmidjusz
post 10.01.2014, 22:07:46
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


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?

Ten post edytował irmidjusz 10.01.2014, 22:09:32


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
Indruś
post 12.01.2014, 11:42:00
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.12.2013

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.09.2024 - 08:10