Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Zapytanie znajdujące 10x takich samych rekordów
Forum PHP.pl > Forum > Przedszkole
Weles
Witam!

Mam pewien problem z napisaniem zapytania.

Chodzi o to, aby zapytanie znajdywało w ciągu ostatnich 5 minut rekordy w których polu "wiadomosc" jest 10x taka sama wiadomość.

Kolumny:
kiedy (zawierają np: 2013-05-09 18:22:10)
wiadomosc (zawierają wiadomości np: jestem pro)

I właśnie tutaj pada pytanie, jak złożyć zapytanie które wszystkie osoby znajdzie które wysyłały po 10x taką samą wiadomość w ciągu 5 minut i wylistuje te wszystkie osoby po 1x a nie np. 10x (bo 10x wysyłał wiadomość). Nick użytkownika jest w kolumnie "wiadomosc" w takiej formie: "Kowalski : Jestem pro".

Siedzę nad tym już kilka godzin i w żaden sposób nie wiem jak to ułożyć..

Proszę o pomoc.

Pozdrawiam!
lobopol
Coś w stylu
  1. SELECT wiadomosc FROM tabela
  2. WHERE DATE_SUB(CURDATE(),INTERVAL 5 MINUTE) <= DATA
  3. GROUP BY wiadomosc HAVING COUNT(1) > 5
ber32
Witam. Pokaż kod co zrobiłeś
Weles
Witam.

Trochę źle opisałem pewien element.

Chodzi mi o to, aby zapytanie całą tabelkę przeszukało i znalazło rekordy które ktoś napisał w przeciągu (dajmy na to minuty).

Czyli np:

19:58:01
19:58:09
19:58:17
19:58:19
19:58:22
19:58:29
19:58:39
19:58:45
19:58:52
19:58:58

Wtedy ktoś wysłał taką samą wiadomość - i zapytanie wykryje że w ciągu 1 minuty pisał tą samą wiadomość.

Natomiast zaytanie od pana lobopol sprawdza w danym okresie czasu po prostu kto pisał wiadomości.

  1. mysql_query("SELECT * FROM shout_log WHERE DATE_SUB(CURDATE(),INTERVAL '1' MINUTE) <= kiedy GROUP BY wiadomosc HAVING COUNT(1) > 5");


Zapytanie działa dobrze, z tą różnicą że chodzi mi o to jak ktoś napisał w ciągu minuty 10 takich samych wiadomości.
lobopol
no to grupuje w ciągu 1 minuty takie same wiadomości a powiedziałeś, że w wiadomości masz login więc powinno spełniać swoją role tylko 5 na końcu na 9 zmień
Weles
aha, przepraszam ale pierwszy raz widzę "HAVING" i zabardzo nie rozumiałem co znaczy.

W takim razie jest tylko jeden problem.

DATE_SUB(CURDATE(),INTERVAL '1' MINUTE) <= kiedy

Pokazuje wszystko w ciągu 1 DNIA, jak wpisze 1 DAY to pisze w ciągu 2 DNI, jak 1 SECOND to także w ciągu 1 dnia rekordy.

Z tej funkcji dość często korzystałem używając ją do pokazywania dni (np. w ciągu 3 dni nieaktywni gracze w grze itd) - ale tutaj po prostu nie chce działać nie wiem czemu w tym zapytaniu... co może być problemem?
lobopol
w jakim formacie trzymasz datę?

zmień curdate na NOW
Weles
Zadziałało.
Ale nie rozumiem teraz dlaczego inne skrypty w których używałem CURDATE mi działają, np:

  1. $spr_stron = round(mysql_num_rows(mysql_query("SELECT * FROM $baza_player.player WHERE level >= '".$ranking_od_poziomu."' $not_like AND DATE_SUB(CURDATE(),INTERVAL '".$nie_aktywni."'-1 DAY) <= last_play AND admin NOT LIKE '1' ORDER BY level DESC, exp DESC"))/$rekordy, 0);
  2.  
  3. $wszyscy_gracze = mysql_query("SELECT * FROM $baza_player.player WHERE level >= '".$ranking_od_poziomu."' $not_like AND DATE_SUB(CURDATE(),INTERVAL '".$nie_aktywni."'-1 DAY) <= last_play AND admin NOT LIKE '1' ORDER BY level DESC, exp DESC LIMIT $rekordy_od, $limit_do");
  4.  
  5. $czas_gry = mysql_query("SELECT * FROM $baza_account.account WHERE DATE_SUB(CURDATE(),INTERVAL '7' DAY) <= last_play");


A w tym skrypcie nie działa chodź pole w tabeli jest identyczne.

Tak czy owak bardzo Ci dziękuję za pomoc, teraz zapytanie działa super, a o zmianie z CurDate na NOW chyba bym nie wpadł za tydzień tongue.gif

Pozdrawiam!
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.