Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie do bazy gdzie występują dwa parametry where
Forum PHP.pl > Forum > Bazy danych > MySQL
Jaremilus
Witam serdecznie,

potrzebuje sprawdzić wartość pewnego pola, ale mam problem ze stworzeniem poprawnego zapytania do bazy:

- wybierz wszystkich użytkowników z tabeli data_uzytkownikow, gdzie pole z numerem 10 ma wartość test oraz gdzie pole z numerem 11 ma wartość $moja_zmienna oraz podlicz ilość wystąpień

  1. $moja_zmienna = wartosc;
  2. $test = $wpdb->get_var("SELECT * FROM data_uzytkownikow WHERE (field_id = 10 AND value = test) AND (field_id = 11 AND value = $moja_zmienna) COUNT");


w bazie wyglada to tak:

- id | field_id | user_id | value
- 1 | 10 | 4 | test
- 2 | 11 | 4 | tresc

jak mogę to poprawnie zapisać?
Jaremilus
dzięki za opis count smile.gif

Nadal nie potrafie wybrać tylko tych którzy spełniają oba warunki WHERE o takich wartościach, mogę zrobić co prawda:

  1. $moja_zmienna = tresc;
  2. $test = $wpdb->get_var("SELECT field_id, value, COUNT(user_id) FROM data_uzytkownikow WHERE field_id = 11 AND value = '$moja_zmienna' GROUP BY user_id");


wtedy zwraca jeden w count ale nie uwzględnia (chyba), że oprócz tego musi być spełniony drugi warunek tj. field_id = 10 AND value = 'test'

potrzebuje po prostu sprawdzić ile razy $moja_zmienna występuje dla użytkownów którzy wybrali pole 11 z wartoscią test
com
no to może to pogrupuj po tym co potrzebujesz też oprócz tego smile.gif
Jaremilus
Dziękuje za podpowiedź - teraz dziala smile.gif

  1. $moja_zmienna = tresc;
  2. ("SELECT COUNT('user_id') FROM 'data_uzytkownikow' WHERE 'field_id' = 11 AND value = '$moja_zmienna' GROUP BY 'value' = 'test'");
com
nie o to mi chodziło biggrin.gif to raczej nie działa wink.gif
Jaremilus
zwróciło wiersz z liczbą :/

no nic, znalazłem tutaj http://webmaster.helion.pl/index.php/kursm...nkcje-grupujace klauzule having, możne tego jakoś w moim wypadku użyc?

PS: dzięki za cierpliwość wink.gif
IProSoft
Spróbuj

  1. $wpdb->get_var("SELECT COUNT(*) FROM data_uzytkownikow WHERE field_id = 11 AND value = '" . $moja_zmienna . "'");
Jaremilus
IProSoft owszem tak zadziała, ale sprawdzi wszystkich userów, w moim przypadku (wordpress) w kodzie mam:

  1. $uzytkownicy = get_users( array( 'role' => 'uzytkownik', 'fields' => array( 'user_nicename' ) ) );
  2.  
  3. foreach ($uzytkownicy as $uzytkownik) {
  4. if ($uzytkownik->user_nicename == $nicename_uzy) {
  5. foreach ($uzytkownicy as $uzytkownik) {
  6. count($uzytkownicy);
  7. }
  8. $ile_nazw = count($uzytkownicy) + 1;
  9. $nicename_uzy = $imie . "-" . $nazwisko . "-" . $ile_nazw;
  10. }
  11. else {
  12. $nicename_uzy = $imie . "-" . $nazwisko;
  13. }
  14. }


i tak x razy żeby to wykonać, z tego powodu pomyślałem, że będzie prościej i szybciej zapytać bazę ograniczyć wyniki i pobrać liczbę.
w przykładzie z bazą wyglądało by to tak
- id | field_id | user_id | value
- 1 | 10 | 4 | uzytkownik //moja rola
- 2 | 11 | 4 | tresc //nicename które sprawdzam
com
zawsze możesz podzapytaniem smile.gif
IProSoft
A możesz dokładnie opisać swój ostatni kod, bo średnio go łapię :-)

Ew. po kombinuj z GROUP BY, np wg value:

  1. GROUP BY value
Jaremilus
Mogę, najpierw zmodyfikowałem stronę rejestracji buddypressa: http://forum.php.pl/index.php?showtopic=240841
Jako, że ten element mi już działa, to teraz modyfikuje co ma się stać po rejestracji, a dokładniej po aktywacji konta. Wysyłam notifikację na pm wewnątrz strony, przypisuje użytkownikom rolę w serwisie oraz to co w kodzie, który podałem modyfikuję link do profilu tak, aby miał strukturę:
- mojastrona/spolecznosc/imie-nazwisko-(ewentualnie numer, jeśli się powtarza)
- mojastrona/spolecznosc/nazwa-typ-miasto-(numer)

get_users wykonuje za mnie zapytanie o argumentach rola i pole, przez co wyniki są ograniczone do danej grupy.
Następnie wrzucam to do pętli w której sprawdzam czy składnia tj. link już nie występuje w serwisie.
Jeśli już istnieje to podliczam ile razy i modyfikuje linka dla aktywowanego użytkownika dodając na końcu liczbę.
Jeśli nie to zostawiam bez numeru.
Na koniec aktualizuje odpowiednie pola w bazie.
IProSoft
Pobieranie wszystkich userów w takim wypadku to niepotrzebne zapytanie, zresztą pozostały kod też.

Wykonaj to tak, że odrazu zapytasz o liczbę userów z takim loginem zapytaniem:

  1. $count = $wpdb->get_var("SELECT COUNT(*) FROM data_uzytkownikow WHERE field_id = 11 AND value LIKE 'imie-nazwisko%'") //lub podobne wyszukujące po nazwie;
  2. if( $count == 0 )
  3. {
  4. $nicename_uzy = $imie . "-" . $nazwisko;
  5. }
  6. else
  7. {
  8. $nicename_uzy = $imie . "-" . $nazwisko . "-" . $count;
  9. }


Takie zapytanie odrazu poda Ci ilość userów, wg której zrobisz resztę, nie musisz nawet iterować po userach.
Jaremilus
Wiem, że niepotrzebne dlatego pytałem.

Na najprostrze rozwiązanie czasem najtrudniej wpaść ...

Cytat
$count = $wpdb->get_var("SELECT COUNT(*) FROM data_uzytkownikow WHERE field_id = 11 AND value LIKE 'imie-nazwisko%'") //lub podobne wyszukujące po nazwie;
if( $count == 0 )


Dzięki panowie!

PS: o tych podzapytaniach też nie wiedziałem wink.gif
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.