Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] zapytanie do bazy - jak to zrobic?
Forum PHP.pl > Forum > Przedszkole
rml
witam,

to znow ja z moimi skomplikowanymi zapytaniami winksmiley.jpg ktore niektorzy uwazaja za proste... ale...


mam tabele:

| ip | godz | data |

a zalozenia sa takie ze moze byc wiele wpisow z jednego ip (to takie jakby statystyki)...

a teraz potrzebuje rozroznic wizyty od zwyklych klikniec, czyli zakladam ze kazde ip ma 60 minut na to zeby stracic aktywnosc (jak nastapi klikniecie z tego samego ip po 60 minutach - zalicza kolejna wizyte).

no i teraz - jak zapytac baze danych o wszystkie wpisy z danego ip ktore sa "nie starsze niz godzine temu"? problemem jest to ze zmienia nam sie punkt odniesienia, bo to musi byc godzina od ostatniego klikniecia... czyli od ostatniego wpisu... pamietajac o tym ze moze nastapic kolejne klikniecie z tego ip (wiec nie mozna sie ograniczyc do daty...)

poza tym: czy zapisywanie daty i czasu w oddzielnych kolumnach nie powoduje jakiegos problemu? czy on wie ze np. jak cofam go o 60 min o godzinie 0:10 to ze zmieni mu sie data? jak sobie poradzic ze zliczaniem takich wizyt - ktore beda zahaczac o rozne daty?


pozdrawiam serdecznie,
rml.
L_Devil
ja bym zrobił tak - zapisz datę/godzinę w formacie UNIX time stamp [Liczba sekund jakie upłynęła od 1 Stycznia 1970r] (jest to funkcja time() w php, nie pamiętam jaka w mysqlu smile.gif ) - łatwiej się tym operuje, można potem konwertować na zwykłą datę funkcją
  1. <?php
  2. date(&#092;"format\", $timestamp_ściągnięty_z_bazy);
  3. ?>


Wchodzisz na stronę pobierasz
  1. <?php
  2. mysql_query(&#092;"SELECT * from tablica WHERE date<\".(time()-3600).\"AND ip like '\".$adres_ip.\"'\");
  3. ?>
i masz pobrany rekord, w którym data jest starsza o godzinę od aktualnej dla danego IP.
rml
ha! smile.gif tyle to ja sam potrafie smile.gif

chodzi mi o to zeby nie uzywac php - ale zrobic to zapytaniem mysql, a poza tym Ty wyszukujesz rekordy starsze o godzine od aktualnej godziny, a nie od ostatniego wpisu z danego ip...

dlatego napisalem ze to skomplikowane zapytanie winksmiley.jpg

czekam na uwagi smile.gif


pzdr,
rml.
gilbo
Nie wiem oco ci chodzi? L_Devil Podał ci dobre rozwiązanie problemu a ty nażekasz. Może chodzi o to, że to nie ma być skrypt tylko samo zapytanko do mysql ale to można napisać a nie nażekasz...

Problem jest prosty tylko jakbyś tłumaczył lepiej to na pewno uzyskałbyś odrazu odpowiedź a ty snujesz opowiadania nie potrzebne zamiast przedstawić rzeczowo problem!

No więc zapytanie SQL powinno wyglądać tak:
  1. SELECT *
  2. FROM tablica WHERE date<(unix_timestamp()-3600) AND ip='adresip'


Żeby nie było wątpliwości przetłumaczę na "ludzki" laugh.gif
  1. WYBIERZ WSZYSTKO Z tablicy GDZIE date JEST MNIEJSZE NIŻ (DATA UNIXOWA MINUS 3600 MILISEKUND) I ip RÓWNA SIę 'adresip'


Pozdrawiam w wierze że skapniesz się że 'adresip' musisz zamienić na cyferki oddzielone kropkami które tworzą adres ip np 127.0.0.1 dzięki czemu nie wytkniesz mi jakiegoś straszliwego błędu:D

Pozdrowienia biggrin.gif
Kamis
offtopic.gif

Nie można dublować tematów. Na MySQL'u i tutaj wpisujesz to samo... Masz dwa takie same rozwiązania i jeszcze go nie rozumiesz?

TOTAL

PS.http://forum.php.pl/index.php?act=ST&f=51&...ndpost&p=181454
SongoQ
@L_Devil po co w php zwracac timestampa jak to samo osagniesz w SQLu.

W tym 2 poscie podalem Ci jak bym to rozwiazal 2 proste zapytania i 1 warunek.
rml
@gilbo - Ty chyba nie czytales mojego posta, prawda? przeciez napisalem "chodzi mi o to zeby nie uzywac php - ale zrobic to zapytaniem mysql", tak? tak napisalem? to prosze czytaj. dziekuje. poza tym jestes malo zabawny.

@reszta - wydaje mi sie, ze nadal sie nie rozumiemy - wpisow z danego ip jest wiele i trzeba znalezc nie "wszystkie ktore byly godzine temu i krocej", ale "grupy wpisow ktore sa od siebie oddzielone minimum odstepem 60 minut", haraszo? w ten sposob chce rozdzielac wizyty od odslon...

@songoQ - Twoje drugie rozwiazanie nie jest dobre, gdyz w tej samej tabeli trzymam rowniez informacje o zadanych url'ach zeby wiedziec ktore strony sa odwiedzane a ktore nie itd... wiec musze miec na kazda odslone jeden rekord...


pzdr,
rml.
SongoQ
Cytat
@songoQ - Twoje drugie rozwiazanie nie jest dobre, gdyz w tej samej tabeli trzymam rowniez informacje o zadanych url'ach zeby wiedziec ktore strony sa odwiedzane a ktore nie itd... wiec musze miec na kazda odslone jeden rekord...


Nie podalem tutaj gotowego rozwiazania tylko pomysl jak to rozwiazac. Co za problem zamiast update wykorzystywac INSERT, do SELECTA dodac wiecej warunkow, lub troszeczke zmodyfikowac.
rml
@songoQ - smile.gif ja oczywiscie to rozumiem - nie jestem kompletnym laikiem smile.gif ale to o czym Ty piszesz juz mam dawno zrobione smile.gif

teraz chodzi mi o to zapytanie do bazy danych, aby wyjac te zapisane dane, bez wprowadzania specjalnych pol w stylu "id" itd... tylko po godzinie rozpoznawac smile.gif
SongoQ
Cytat
teraz chodzi mi o to zapytanie do bazy danych, aby wyjac te zapisane dane, bez wprowadzania specjalnych pol w stylu "id" itd... tylko po godzinie rozpoznawac

Widze ze nie rozumiesz idee uzywania identyfikatorow.

Napisz dokladnie jaki select chcesz uzyskac to CI napisze.
rml
rozumiem! nawet ja w tej chwili stosuje! ale chcialem zmniejszyc ilosc kolumn w tabeli dzieki wykorzystaniu zapytania mysql opartego o czas.

teraz moja tabela w przyblizeniu wyglada tak:

|typ|ip|data|godz|id|

pole typ przybiera 4 wartosci VIS, HIT, VRB i HRB.

VIS - wizyta - czyli wyswietlenie strony przez IP z ktorego nie bylo wyswietlenia przez minumum godzine wstecz...

HIT - wyswietlenie strony kiedy znalazl w bazie jakikolwiek wpis z godziny wstecz

VRB i HRB to analogiczne rzeczy jak wyzej, tylko ze wtedy gdy rozpoznal poprzez user_agent ze to robot a nie user...

ip, data, godz - jasne.

id - jest to generowany unikanly numer - generowany jest w trakcie wpisu VIS, a potem kazdy HIT bierze go z VIS... (w tej chwili juz wiem ze to zle, dlatego, ze czasem wizyty botow trwaja dluzej niz godzine, i wtedy nie wpisuje nic, bo VRB byl dawniej niz 60 minut temu - czyli musi brac z HRB, ale to nie wazne smile.gif


i teraz chodzi mi o to, zeby wyszukac wszystkie wpisy w bazie z jednej wizyty sugerujac sie tylko czasem a nie typem i id... czyli znalezc wizyty ktore byly z jednego ip i wszystkie wpisy z tego ip byly od siebie oddalone o nie wiecej niz 60 minut... czyli zeby znalazl grupy rekordow wpisane do bazy z roznica wieksza niz 60 minut...

to trudno opisac smile.gif dlatego moze tyle nieporozumien w tym temacie smile.gif

wiec jak juz pisze tak dlugiego posta - to napisze jeszcze dluzszego aby wyjasnic wszystkie watpliwosci.

mamy rekordy:

127.0.0.1 | data dzis | 10:00:00
127.0.0.1 | data dzis | 10:01:00
127.0.0.1 | data dzis | 10:10:00
127.0.0.1 | data dzis | 10:50:00
127.0.0.1 | data dzis | 12:00:00
127.0.0.1 | data dzis | 12:10:00
127.0.0.1 | data dzis | 10:30:00
127.0.0.1 | data dzis | 19:00:00

chcialbym zeby zapytanie wyjelo z takiej bazy 3 "wizyty" pierwsza zaczynajaca sie o 10:00:00, druga o 12:00:00 i trzecia o 19:00:00...

teraz jasniej sie zrobilo? smile.gif jejq - juz nie wiem jak pisac zeby bylo dobrze - szczegolnie ze nie jestem pewny nawet czy to mozliwe zeby to zrobic... takie zapytanie... bycmoze trzeba to zrobic kombosem dwoch zapytan? smile.gif w petli?

no i poza tym jeszcze dochodzi problem zmiany daty - jak go rozwiazac? jesli jedna wizyta trwa od 23:30:00 do 0:20:00 to zmieniaja sie daty i skrypt mi sie gubi (nawet teraz przy ID)...


pozdrawiam,
rml.
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.