Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]PHP MYSQL - zapytanie do dwóch tabel
Forum PHP.pl > Forum > Przedszkole
maraska
Witam.

Mam w bazie dwie tabele, m/in z polami jak poniżej:

tabela users:
id... user_id..........email

tabela image
id... user_id.......user_image

Jak widać w obu jest pole user_id.
Nie wszyscy użytkownicy, którzy mają email mają też user_image w tabeli image.
Rekord do tabeli image jest dodawany przy dodawaniu obrazku i zawiera tylko pełne pola, tzn. nie ma np. user_image o wartości NULL. Za to user_id powtarza się w tej tabeli wielokrotnie, gdy użytkownik ma wiele obrazków. Pole user_image zawiera nazwę rodzaju obrazka (jest kilka)

Chcę wysłać mailing tylko do tych użytkowników posiadających email w tabeli users (nie wszyscy mają), którzy mają określony typ obrazka w tabeli images w polu user_image.

Jak napisać takie zapytanie w php?

(tabele są bardziej rozbudowane, ale podaję tylko to co istotne)

Z góry dziękuję za pomoc

Chodzi tylko o zapytanie do bazy
zbychoCom
Np. tak:
SELECT `users.user_id` FROM `users`,`image` WHERE `image.user_image` = $klucz_wyszukiwania AND `image.user_id`=`users.user_id` AND `users.email` != NULL

mortus
  1. SELECT `u`.`email` FROM `users` `u` LEFT JOIN `image` `i` USING (`user_id`) WHERE `u`.`email` IS NOT NULL AND `i`.`user_image` LIKE 'TYP_OBRAZKA'

gdzie:
TYP_OBRAZKA - filtr

PS: Dostosowałem do wymagań.
maraska
Cytat(zbychoCom @ 9.04.2013, 20:43:31 ) *
Np. tak:
SELECT `users.user_id` FROM `users`,`image` WHERE `image.user_image` = $klucz_wyszukiwania AND `image.user_id`=`users.user_id` AND `users.email` != NULL


Dzięki Zbycho za super szybką pomoc.
Tylko, że ja chcę wyciągać e-mail usera, który ma user_image o nazwie "nazw%"
Czyli może tak jak poniżej?

SELECT `users.email` FROM `users`WHERE `image.user_image` LIKE "nazwa%" AND `image.user_id`=`users.user_id` AND `users.email` != NULL

Dobrze to będzie?

Koledzy, to które zapytanie będzie lepsze z JOIN czy bez?



I jeszcze rozszerzę temat. Gdyby chcieć pobierać więcej wartości niż email, to powinno to wyglądać tak, jak poniżej?

  1.  
  2. <?php
  3.  
  4. //includy - klasa mailera, klasa bazy
  5.  
  6. $sql = mysql_query("SELECT `u`.`*` FROM `users` `u` LEFT JOIN `image` `i` USING (`user_id`) WHERE `u`.`email` IS NOT NULL AND `i`.`user_image` LIKE 'TYP_OBRAZKA'")
  7.  
  8. while($c = mysql_fetch_array($sql)) {
  9.  
  10. $imie = $c['imie'];
  11. $nazwisko = $c['nazwisko'];
  12. $email = $c['email'];
  13.  
  14. //Tu wysyłamy maila
  15.  
  16. }
  17.  
  18. ?>
  19.  
zbychoCom
Jeśli chodzi o twoją propozycję to odpowiedź brzmi: nie - nie będzie dobrze;
Natomiast jeśli chodzi o JOIN to nie wiem, ale chętnie się dowiem.
p.s. W zapytaniu korzystasz z dwóch tabel a za FROM masz referencje do zaledwie jednej.
mortus
Oba zapytania zadziałają niemal identycznie, z tym że do wyszukiwania pustych/niepustych (NULL/NOT NULL) wartości nie powinno się używać operatorów arytmetycznych. Zostało to dokładnie opisane w dokumentacji.

Pierwsze zapytanie to również zapytanie ze złączeniem, ale w tym przypadku INNER JOIN. Nas natomiast interesują wszystkie rekordy z tabeli users i odpowiadające im rekordy z tabeli image, stąd LEFT JOIN.

Mała podpowiedź do drugiego pytania:
`u`.* - wszystkie kolumny z tabeli users
`i`.* - wszystkie kolumny z tabeli image
`u`.*, `i`.* - wszystkie kolumny z tabel users i image

@zbychoCom: Za JOIN-em również znajduje się nazwa tabeli (i ewentualnie jej alias).
maraska
Właśnie też nigdy nie używałem JOIN a czytałem, że mniej obciąża.

Nie chciałbym wysłać do użytkownika maila o treści "masz obrazek...." jeżeli obrazka nie ma, więc pytanie, czy tak będzie OK
  1.  
  2. <?php
  3.  
  4. //includy - klasa mailera, klasa bazy
  5.  
  6. $sql = mysql_query("SELECT * FROM `users`WHERE `image.user_image` LIKE "nazwa%" AND `image.user_id`=`users.user_id` AND `users.email` != NULL LIMIT 0, 20000")
  7.  
  8. while($c = mysql_fetch_array($sql)) {
  9.  
  10. $imie = $c['users.imie'];
  11. $nazwisko = $c['users.nazwisko'];
  12. $email = $c['users.email'];
  13.  
  14. //Tu wysyłamy maila
  15.  
  16. }
  17.  
  18. ?>
  19.  
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.