Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pobranie rekordów z tabeli A których ID nie ma w tabeli B, Jak zapytać o to Bazę Danych?
adbacz
post
Post #1





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Załóżmy taką sytuację:

TABELA A
  1. user_id | login | firstname
  2. 1 | admin | Adam
  3. 2 | user | Karol
  4. 3 | men | Marcin


TABELA B
  1. user_id | verified | sum
  2. 2 | 1 | 428


Jak zapytać serwer, by zwróciło mi tylko te rekordy, które są w w TABELI A, ale nie ma ich w TABELI B?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




do tabeli A robisz LEFT JOIN tabeli B a potem w warunku WHERE robisz: WHERE TabelaB.user_id is null
Go to the top of the page
+Quote Post
adbacz
post
Post #3





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Nie zwraca danych tak jakbym tego chciał.

  1. SELECT * FROM `#__user` LEFT JOIN `#__schoolvirtualdiary_pupils`
  2. ON (`#__schoolvirtualdiary_pupils`.`id_user` > 0) WHERE `#__user`.`range` = '$pupilRange' AND `#__user`.`id` != `#__schoolvirtualdiary_pupils`.`id_user`


W kolumnie `#__user`.`range` jest przechowywana ranga użytkownika i potrzebuje pobrać użytkowników tylko tej rangi.

Ogólnie to zapytanie powinno brzmieć: Pobierz użytkowników z tabeli #__user oraz #__schoolvirtualdiary_pupils tak, że ich ranga jest równa $pupilRange oraz tak, że nie ma ich jeszcze w tabeli #__schoolvirtualdiary_pupils. Czyli na zbiorze $result = #__user \ #__schoolvirtualdiary_pupils;
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




w ON laczy sie dwie tabele ze sobą, a ty tego nie robisz.
w WHERE miales dac is NULL i tez tego nie widze.
Go to the top of the page
+Quote Post
adbacz
post
Post #5





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Ok, poradziłem sobie. Zapytanie wygląda ta:

  1. SELECT * FROM `#__user` LEFT JOIN `#__schoolvirtualdiary_pupils` ON (`#__user`.`id` = `#__schoolvirtualdiary_pupils`.`id_user`) WHERE `#__user`.`range` = '$pupilRange' AND `#__schoolvirtualdiary_pupils`.`id_user` IS NULL


Przeczytałem gdzieś, że można zrobić jeszcze tak, i też działa:

  1. SELECT * FROM `#__user` WHERE `#__user`.`range` = '$pupilRange' AND `#__user`.`id` NOT IN (SELECT `id_user` FROM `#__schoolvirtualdiary_pupils`)
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tylko ze druga wersja prawdopodobnie dluzej sie wykonuje
Go to the top of the page
+Quote Post
Pyton_000
post
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Możesz też zrobić zwykłe Join
  1. SELECT
  2. *
  3. FROM
  4. `#__user`
  5. JOIN
  6. `#__schoolvirtualdiary_pupils` ON (`#__user`.`id` = `#__schoolvirtualdiary_pupils`.`id_user`)
  7. WHERE
  8. `#__user`.`range` = '$pupilRange'


Ten post edytował Pyton_000 1.12.2013, 08:20:00
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 20:03