Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] jedno zapytanie, pobieranie z dwch tabel
Forum PHP.pl > Forum > Przedszkole
bulimaxiu
Witam.

Nie wiem jak dobrze zatytuowac watek (jakby co poprawie) i jak nawet szukac odpowiedzi.

Mam dwie tabele mySQL:
Pierwsza tabela:
pierwsza osoba - id_dzialu1
druga osoba - id_dzialu2

Druga tabela:
id_dzialu1 - pierwszy dzial
id_dzialu2 - drugi dzial

Zapytanie:
  1. SELECT `kol1`,`kol2` FROM pierwsza_tabela

ale chcialbym, zeby zamiast wartosci z kolumny 2 pierwszej tabeli (id_dzialu) od razu zwracal kolumne 2 z drugiej tabeli (nazwa dzialu).

Jak to skonstruowac?
zordon
poczytaj o joinach
jajcarzd1
Cytat(bulimaxiu @ 10.06.2010, 15:46:28 ) *
Witam.

Nie wiem jak dobrze zatytuowac watek (jakby co poprawie) i jak nawet szukac odpowiedzi.

Mam dwie tabele mySQL:
Pierwsza tabela:
pierwsza osoba - id_dzialu1
druga osoba - id_dzialu2

Druga tabela:
id_dzialu1 - pierwszy dzial
id_dzialu2 - drugi dzial

Zapytanie:
  1. SELECT `kol1`,`kol2` FROM pierwsza_tabela

ale chcialbym, zeby zamiast wartosci z kolumny 2 pierwszej tabeli (id_dzialu) od razu zwracal kolumne 2 z drugiej tabeli (nazwa dzialu).

Jak to skonstruowac?


To może

  1.  
  2. SELECT t1.*, t2.*
  3. FROM tabela1 AS t1
  4. LEFT JOIN tabela AS t2 USING(iddzialu)


Nie wiem czy dobrze dałem kolumnę w USING bo trochę niejasno napisałeś jakie masz konkretnie kolumny w obu tabelach i jakie chcesz mieć w wynikach. Ale w zasadzie jeśli kolumny po których chcesz łączyć tabele są o takie samej nazwie to podmień sobie nazwę w USING
Wiktor P.
  1. tabA:
  2. id
  3. kol1
  4. kol2
  5.  
  6. tabB:
  7. id
  8. klucz_obcy
  9. kol1
  10. kol2
  11.  
  12. referencja:
  13. CONSTRAINT tabB_fk FOREIGN KEY(klucz_obcy) REFERENCES tabA(id) ON UPDATE CASCADE ON DELETE CASCADE
  14.  


  1. SELECT tabA.kol1, tabB.kol2
  2. WHERE
  3. tabB.klucz_obcy = tabA.id;
  4.  


I pracujesz na obydwu tabelach połączonych referencją.

Oczywiście ten przykład może być rozbieżny z twoją bazą danych.
Jak trzeba napiszę krok po kroku wzorzec.

Jeśli podałem zły przykład to można też zastosować:
  1. Select kol1 from tab1
  2. UNION
  3. select kol2 from tab2;

Tu nie musisz mieć stworzonych relacji w tabelach.

PS - czytając o JOIN'ach jak dobrze radzi 'zordon', czytaj o JOIN'ach w MySQL, jeśli na nim pracujesz.
Jest lekka rozbieżność, jeśli chodzi o JOIN'y w rożnych serwerach SQL.
bulimaxiu
Dziękuję za porady.

Rzeczywista tabela:
tabela_produktów: opt_name, producent_id
tabela_producentów: producent_id, opt_name
(nie wiedziałem, że będzie konflikt nazw kolumn)

Muszę otrzymać rezultat w tabeli:
`tabela_produktów`.`opt_name` | `tabela_producentow`.`opt_name`

  1. INNER
skutkuje zrozumiałym komunikatem "Column 'opt_name' in where clause is ambiguous", więc tym może się nie udać. Działa poprawnie gdy nie ma kolizji nazw kolumn.

jajcarzd1:
Wyszło mi takie zapytanie
  1. SELECT `t2`.`opt_name`,`t1`.`st_product`.`code`,`st_product`.`opt_name`,`opt_image` FROM `localhost`.`st_product` AS `t1` LEFT JOIN `localhost`.`st_producer` AS `t2` USING (`st_product`.`producer_id`) WHERE (`code` LIKE .......
ale niestety error SYNTAX. Próbowałem kilka innych kombinacji, ale też bez rezultatu

Przy
  1. UNION:
The used SELECT statements have a different number of columns

Wydaje mi się, że INNER może zadziałać, ale trzeba by było zmienić nazwę kolumny wynikowej, np.
  1. SELECT `opt_name_producent`
. Jest na to polecenie?
jajcarzd1
Jeżleli używasz aliasów tabel to używaj potem w zapytaniu przed każdą kolumną tego aliasu, po drugie jeśli masz takie samy nazwy kolumn w obu tabelach to możesz użyć aliasu dla jednej

  1. SELECT t1.opt_name, t2.opt_name AS opt_name2 FROM tabela_produktow AS t1 LEFT JOIN tabela_producentow AS t2 USING(producent_id)


Możesz też użyć zmiast USING innej składi jeśli kolumny po których łączysz tabele są o innej nazwie np.

  1. SELECT t1.opt_name, t2.opt_name AS opt_name2 FROM tabela_produktow AS t1 LEFT JOIN tabela_producentow AS t2 ON t1.kolumna1 = t2.kolumna2
bulimaxiu
Dziękuję za podpowiedzi. Ostatecznie zadziałało
  1. SELECT `st_product`.`opt_name` AS `product_name`, `st_producer`.`opt_name` AS `producer_name`
  2. FROM `st_product`
  3. JOIN `st_producer`
  4. ON `st_product`.`producer_id` = `st_producer`.`id`
  5. WHERE ...
Niestety komenda USING zwracała syntax. Aliasy okazały się zbędne.
jajcarzd1
Cytat(bulimaxiu @ 11.06.2010, 17:57:27 ) *
Niestety komenda USING zwracała syntax. Aliasy okazały się zbędne.


Bo przy USING obie kolumny muszą mieć te same nazwy
bulimaxiu
Pozwolę jeszcze jedno pytanko w tej kwestii: Czy można JOINować oprócz innych tabel również tabele z innych baz danych? (oddzielne loginy i hasła)
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.