Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Specyficzne zapytanie - możliwe?
Forum PHP.pl > Forum > PHP
Michael2318
Mam tabelę, a w niej m.in. takie pola:

| USER_ID | USER_IP |

I teraz moje pytanie - czy da się spreparować takie zapytanie, które wyciągnie mi USER_ID, ale tylko te, gdzie USER_IP nalezy do kilku userów? Przykład:

| USER_ID | USER_IP |
|1| 123.3433.544 |
|154| 543.6543.543 |
|653 | 654.543.543 |
|643| 123.3433.544 |

I w tym przypadku zwróciłoby mi w tablicy:
  1. 'ID' => '1, 643',
  2. 'IP' => '123.3433.544'


bo IP 123.3433.544 powtarza się przy userze o ID 643 oraz 1. Jest możliwość spreparowania takiego zapytania? Nie mogę sobie pozwolić na wyciągnięcie wszystkich adresów IP i wyszukiwanie tego z poziomu PHP bo jest spora baza z userami, dlatego wolałbym to załatwić jakimś zapytaniem.
IceManSpy
select USER_ID from tabela where USER_IP= '123.3433.544'
Michael2318
Tak, tylko skąd ja mam wiedzieć, że akurat to IP się powtarza? Chcę wyłapać wszystkie powtórki, mając ok. 20.000 rekordów w bazie.
jeremiash
Nie ten dział kolego.

Kosztem wydajności zawsze możesz zrobić w pętli pierwszego zapytania , zapytanie drugie. Bierzesz IP i lecisz drugi raz sprawdzając czy ponownie takie występuje. Poza tym nie lepiej to weryfikować podczas zapisu do bazy niż potem się motać?
Michael2318
Cytat
Poza tym nie lepiej to weryfikować podczas zapisu do bazy niż potem się motać?


Pewnie, że lepiej, ale co jeśli w bazie siedzi już 20.000 rekordów?
Rozumiem, że żadnym zapytaniem tego sprawdzę, jedynie tak jak poprzednik napisał za pomocą kilku zapytań i pętli?
redeemer
Może za pomocą group_concat:
  1. SELECT user_ip,group_concat(user_id) FROM tabela GROUP BY user_ip;
Michael2318
Czy to zapytanie jest aby na pewno dobrze zapisane?
redeemer
A co dostajesz jak je wykonasz? Jaka baza danych?
Michael2318
|USER_IP| USER_ID |
216.654.354 [BLOB - 2bajtów]

Czemu zamiast normalnego ID usera, wyświetla mi się jakieś 'BLOB - 2 bajtów'?
jeremiash
BLOB to typ binarny... Zobacz jakiego typu masz pole i tabelę
redeemer
BLOB - prawidłowo (za manualem group_concat: The result type is TEXT or BLOB unless group_concat_max_len is less than or equal to 512, in which case the result type is VARCHAR or VARBINARY). Zobacz co zawiera w środku.
Michael2318
No właśnie problem w tym, że wystepują też wartości BLOB 3, ale obojętnie w który nie kliknę, to zawsze zwraca:

MySQL zwrócił komunikat: Dokumentacja
MySQL zwrócił pusty wynik (zero rekordów).

A tak naprawdę to to IP przypisane jest do 3 userów.
redeemer
1) Jakiego typu jest kolumna user_id? 2) Wykonaj to zapytanie w PHP i zrób var_dump na tym BLOBie. 3) Sprawdź z rzutowaniem ... CAST(group_concat(user_id) AS CHAR(1024) CHARACTER SET utf8) ...
thek
To nie sprawdzaj w PHPMyAdmin tylko zrób skrypt i sprawdź. Group by i group_concat to prawidłowe rozwiązanie Twojego problemu. Po prostu PhpMyAdmin czasem tak dane wyświetla i tyle. Nie sprawdzałem tego, ale ponoć umieszczenie w pliku konfiguracyjnym PMA:
Kod
$cfg['ProtectBinary'] = FALSE;

daje pożądany efekt.
Można też do końca adresu dokleić:
Kod
&display_blob=true


EDIT: Nie używałem tego często, ale można też w linku +Option przy wynikach zapytania wyklikać pokazywanie zawartości bloba.
Michael2318
1. Typ to mediumint(8)
2. jak ja mam to w ogóle odbierać od strony php? $row = mysql_fetch_assoc($result) i potem $row['user_id'] ? Jeśli tak to zwraca NULL
3. To rzeczywiście pomogło, jedyny problem jest taki, że zwraca mi to w takiej formie:

| USER_IP | USER_ID |
| 232.232.112 | 2 |
| 5434.343.43 | 4,5

I niepotrzebnie ten pierwszy rekord się zwraca bo to ID stoi samo - dwójka jest sama, czyli ten adres IP jest w porządku bo tylko jeden user się z niego zarejestrował. Więc podsumowując, jak wywalić pojedyncze wyniki i jak to odbierać od strony PHP?

  1. SELECT user_ip, COUNT(user_id) as how_many, CAST(group_concat(user_id) AS CHAR(1024) CHARACTER SET utf8) AS users_ids FROM `phpbb_users` GROUP BY user_ip;


Mam już komplet, jedyny problem to taki, że liczyłem na to, iż jeśli w zapytaniu dodam 'WHERE how_many > 1' to to pójdzie, a tu wyskakuje błąd, że pole how_many nie istnieje ;/ Nie mogę tak tego porównać? To załatwiłoby cały mój problem.

EDIT:

OK, finalne zapytanie, które przyniosło zamierzony efekt:

  1. SELECT user_ip, COUNT(user_id) AS how_many, CAST(group_concat(user_id) AS CHAR(1024) CHARACTER SET utf8) AS users_ids FROM `phpbb_users` GROUP BY user_ip HAVING count( user_id ) > 1;
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.