Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] JOIN czy WHERE... AND...AND
Wolfie
post
Post #1





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Witam,


Mam takie tabele w bazie danych :

  1. $sql1 =
  2. "CREATE TABLE IF NOT EXISTS prisoners (
  3. prisoner_id int(11) NOT NULL AUTO_INCREMENT,
  4. name varchar(100) NOT NULL default '',
  5. surname varchar(100) NOT NULL default '',
  6. alias varchar(100) NOT NULL default '',
  7. born varchar(100) NOT NULL default '',
  8. annotation text(5000) NOT NULL,
  9. PRIMARY KEY (prisoner_id)
  10. )ENGINE = InnoDB";
  11.  
  12. $sql3 =
  13. "CREATE TABLE IF NOT EXISTS cells (
  14. cell_id int(11) NOT NULL AUTO_INCREMENT,
  15. floor int(5) NOT NULL,
  16. number int(10) NOT NULL,
  17. places int(5) NOT NULL,
  18. ward_id int(11) NOT NULL,
  19. PRIMARY KEY (cell_id),
  20. FOREIGN KEY (ward_id) REFERENCES wards(ward_id)
  21. )ENGINE = InnoDB";
  22.  
  23. $sql4 =
  24. "CREATE TABLE IF NOT EXISTS prisoners_cells (
  25. prisoner_id int(11) NOT NULL,
  26. cell_id int(11) NOT NULL,
  27. PRIMARY KEY (prisoner_id, cell_id),
  28. FOREIGN KEY (prisoner_id) REFERENCES prisoners(prisoner_id),
  29. FOREIGN KEY (cell_id) REFERENCES cells(cell_id)
  30. )ENGINE = InnoDB";
  31.  


Czyli tabele prisoners, cells i prisonners_cells,
Jak widac tabela prisoners_cells to tabela która łączy tabele prisoners i cells aby mozna bylo przypisac danego więźnia do celi, lub wielu wieźniów do jednej celi.

No i teraz powiedzmy ze chce wyświetlić nazwiska wieźniów którzy przebywają w celi o id = 11.

Po przejrzeniu kilku kursów i kulku próbach mam wątpliwości czy robić to za pomocą JOIN czy WHERE .... AND ... AND....

Moze mi ktos po krótce przedstawić kiedy sie stosuje dane rozwiązanie i dlaczego ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Maciek1705
post
Post #2





Grupa: Zarejestrowani
Postów: 157
Pomógł: 3
Dołączył: 15.06.2009

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


ja bym Ci robił złączenie tych tabel wraz z klauzurą where

select *
from dbo.
tu złączenie inner join
where no i tu warunek którego więźnia chcesz wyświetlić

Go to the top of the page
+Quote Post
cojack
post
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Źle, możesz mieć jednogo więźnia w wielu celach. A chyba nie o to chodzi co?

Musisz zrobić relacjie typu jeden-do-wielu. One-to-many, gdzie jeden więzień może należeć do jednej celi a jedna cela może mięć wielu więźni. Popraw tabele (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Wolfie
post
Post #4





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Wiem ze zle, ten problem poruszalem tutaj (post #3)

A teraz pytalem o co innego (IMG:style_emoticons/default/winksmiley.jpg)


ale juz rozkminilem kwestie ze złączeniami......

-------------------------------------------------------------------------

a jak bys to przrobil zeby byla relacja jeden-wielu ?

Moze odpowiedz w tamtym watku zeby nie bylo crosspostu....

Ten post edytował Wolfie 12.11.2009, 16:42:18
Go to the top of the page
+Quote Post
seth-kk
post
Post #5





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

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


join - to nowsza konstrukcja, zalecana w dokumentacji i moim zdaniem bardziej czytelna
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To ja odpowiem tutaj. Więzień ma przyporządkowaną jedną celę, a więc wystarczy dla więźnia ustawić pole cela (IMG:style_emoticons/default/smile.gif) W ten sposób zawsze będziesz miał sytuację, że więzień jest w konkretnej jednej celi, co zresztą ułatwi Ci potem zapytanie, bo zrobisz szukanie po więźniach, którzy mają określone id celi, a więc bez łączenia się obywasz. Można zrobić jeszcze inaczej, zachowując Twoją strukturę... Wtedy klucz obcy w prisoners_cells tyczący więźnia musiałby być unique (IMG:style_emoticons/default/smile.gif) To zabezpiecza przed dodaniem go do dwóch różnych cel.
Go to the top of the page
+Quote Post
Wolfie
post
Post #7





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


To drugie rozwiazanie bardzej mi sie podoba, nie bo nie musze nic przerabiac (IMG:style_emoticons/default/tongue.gif)

Pozdrawiam
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: 4.10.2025 - 13:03