Wyświetlanie tych samych wyników


(Patrol) #1

Witam!

Jak zrobić by skrypt pobierał tylko rekordy gdzie treść jest identyczna w kolumnie.

Chodzi mi o system szukających oszustów. Gdzie są 2 identyczne ip to dane tego użytkownika zostaną mi pokazane. Z góry dziękuje.


(Kutar 0) #2

Z bazy danych?

Na przykład GROUP BY i wybieranie tych, gdzie ilość jest większa niż 1. Więcej w Google.


(Airborn) #3

Prawdę powiedziawszy nie udało mi się napisać tego przy pomocy GROUP BY tak jak by chciał tego kutar , ale działającą wersję udało mi się uzyskać przy pomocy odpowiedniej perspektywy. Czyli całość wyglądała tak:

CREATE OR REPLACE VIEW ip AS SELECT t.ip, COUNT(*) AS count FROM tabela AS t GROUP BY ip;

a potem tylko w kodzie strony:

SELECT * FROM ip WHERE count>1 ORDER BY count DESC;

w ten sposób dostajesz IP które się powtarzają, a potem wybierasz już tylko odpowiednich użytkowników


(Patrol) #4

Dzięki, nie sprawdzałem, ale mam nadzieje że działa.

A to wymaga modyfikacji w strukturze tabeli?

SELECT * FROM users WHERE count>1 AND ORDER BY login DESC;

(Airborn) #5

To może jeszcze zależeć od bazy danych, działa na pewno na PostgreSQLu, na MySQLu 5.x też powinno działać, MySQL 4.x nie obsługuje widoków (perspektyw) więc nie zadziała w takiej formie.

EDIT:

SELECT * FROM users WHERE count>1 AND ORDER BY login DESC;

zasadniczo, czym jest u Ciebie users? W podanym przykadzie najpierw pokazałem jak utworzyć odpowiedni widok przechowujący informacje o tym ilu użytkowników przypada na jedno ip. Może powiedz coś więcej o strukturze bazy danych to będzie łatwiej.


(Patrol) #6

Tutaj podałem przykład. Poprostu mam bazę z użytkownikami. Skrypt po rejestracji zapisuje ip w odpowiedniej kolumnie. Jeśli jest więcej tych samych ipów pojazuje dane użytkownika.


(Airborn) #7

No i ja również podałem Ci przykład, tworzysz odpowiednią perspektywę, która wybiera poszczególne adresy ip i zlicza krotność ich występowania, i z tej perspektywy wybierasz te wyniki które występują przynajmniej dwukrotnie.


(Patrol) #8

Można jaśniej?


(Airborn) #9

W którym miejscu?


(Patrol) #10

Co to jest perspektywa w php?


(Airborn) #11

Nic, perspektywę tworzy się w bazie danych, to coś w rodzaju wirtualnej tabeli, skłądnie tworzącą odpowiednią perspekyuwę podałem wcześniej:

CREATE OR REPLACE VIEW ip AS SELECT t.ip, COUNT(*) AS count FROM tabela AS t GROUP BY ip;

ale przyznam, że trochę przekombinowałem, jest prostsza metoda... (chociaż teoretycznie może być wolniejsza zdaje się)

SELECT ip, COUNT(*) AS count FROM users GROUP BY ip HAVING COUNT(*) > 1 ORDER BY count DESC;

(Patrol) #12

Czyli w tym

SELECT ip, COUNT(*) AS count FROM users GROUP BY ip HAVING COUNT(*) > 1 ORDER BY count DESC;

Nie muszę twórzyć tych wirtualnych tabel?


(Airborn) #13

Sprawdź jak to działa, to zobaczysz... Nie nie musisz...


(Kutar 0) #14

Chodziło mi o to co Ty zrobiłeś, tylko bez perspektywy, a z najzwyklejszym mysq_fetch_* i wykonaniu kolejnego zapytania jeśli pole z count() >1 .

No ale oczywiście Twoje rozwiązanie lepsze :slight_smile: