![Marcin Mackiewicz](https://static.goldenline.pl/user_photo/154/user_1007002_5b85ed_basic.jpg)
Marcin
Mackiewicz
Programista JAVA, RS
Adware Polska
Temat: Zapytanie do wielu tabel.
Hmmm, trochę chaotycznie opisane. Z ostatniego zapytania SQL wnioskuję że interfejsem do bazy jest jakiś PHP. Proponuję użyć tak jak radzi "Noidea" zrobić dodatkową tabelkę wiele do wielu ale numery umieścić w kolumnie typu text oddzielone jakimś separatorem (np. kropką). Do tego w interface uzyć funkcji 'expolde()' do czytania numerów oraz 'implode()' do zapisywania.Wyszukiwanie jest troszkę nieefektywne ze względu na sprawdzanie tekstu ale zwykły like % sobie poradzi (nie wiem o jak dużej bazie jest mowa).
Dodatkowo dodanie pola uwagi jest świetnym pomysłem.
Lepszego rozwiązania raczej nie ma bo i tak gdzieś musisz zapisywać numery ulic i przypisywać je do odpowiedniego pracownika.
Tak na marginesie budynki socjalne czy więzienia także mają swoje adresy (poczta wymaga pełnego adresu).
![Janusz Skudrzyk](https://static.goldenline.pl/user_photo/134/user_607110_9dac2e_basic.jpg)
Janusz
Skudrzyk
Członek zarządu,
weblabs.pl
Temat: Zapytanie do wielu tabel.
Puść zapytanie przez explain, to zobaczysz czy jest w porządku.Temat: Zapytanie do wielu tabel.
Puściłem przez Explain i mam coś jak:id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE rejon ALL PRIMARY NULL NULL NULL 2
1 SIMPLE pracownik eq_ref PRIMARY PRIMARY 4 rejony.rejon.idPracownik 1
1 SIMPLE pokoj eq_ref PRIMARY PRIMARY 4 rejony.pracownik.idPokoju 1 Using where
1 SIMPLE ulica eq_ref PRIMARY PRIMARY 4 rejony.rejon.idUlica 1 Using where
Interfejsem do bazy jest oczywiście PHP.
Więzienie ma swój adres - ale i tak psują mi przydziałami typu "budynki parzyste, nieparzyste... Zupełnie nie wiem jak to obejść. Bo ideałem by było, żeby można było wybrać swój numer budynku. A tak to myślę nad włożeniem tam listy rozwijalnej, z której można by było wybrać sobie ulicę... Zamiast wpisywać ręcznie.Jakub K. edytował(a) ten post dnia 08.08.11 o godzinie 10:32
![Janusz Skudrzyk](https://static.goldenline.pl/user_photo/134/user_607110_9dac2e_basic.jpg)
Janusz
Skudrzyk
Członek zarządu,
weblabs.pl
Temat: Zapytanie do wielu tabel.
rejon ALL
I masz odpowiedź na to jak dobre jest zapytanie (chociaż explain potrafi się mylić). ALL oznacza, że z tabeli będą brane wszystkie rekordy. Na razie są tylko 2 rekordy, więc po wypełnieniu tabeli może inaczej pobrać dane.
Do ulicy dodaj index na nazwa.
Wrzuć więcej danych do tabel i jeszcze raz odpal explain.Janusz Skudrzyk edytował(a) ten post dnia 08.08.11 o godzinie 14:46
![](https://static.goldenline.pl/user_photo_basic.jpg)
konto usunięte
Temat: Zapytanie do wielu tabel.
Odpowiedz jest prosta wlasciwie sam ja podales w tym kawalku zdania:"niektórzy mają przydzielone połowę ulicy (określone numery)"
Czyli robisz tabele ULICA
w niej masz pole ID i NAZWA
i kolejna tabele STREET_NUMBERS
gdzie masz pole ID,ID_pracownika, ID_ULICY,numbers
czyli pracownik o ID=1
ma przypisana ulice o ID=3
a wyszukujac numery ulic piszesz SELECT numbers FROM STREET_NUMBERS WHERE id_pracownika = 1 AND id_ulicy=3 to zapytanie wyisze ci dokladnie wszystkie numery jakie ma pracownik przypisany.
Konkretnie to tak:
-pokoj-
id_pokoju
wewentrzny
-pracownik-
id_pracownika
imie
nazwisko
dyzur
id_pokoju
id_ulica
-ulica-
id_ulica
nazwa
-street_numbers-
id_street_numbers
id_pracownika
id_ulicy
numbers
Teraz zlaczasz sobie tabelki dla przykladu
SELECT p.imie, p.nazwisko, p.dyzur, po.id_pokoju, po.wewnetrzny, u.id_ulica,u.nazwa
FROM pracownik p
LEFT JOIN pokoj po ON (p.idpokoju = po.id_pokoju)
LEFT JOIN ulica u ON (u.id_ulica = p.Id_ulica)
WHERE u.nazwa='$podanaulica'
a podzapytanie dla jakich numerow ulic jest przypisany dany pracownik
SELECT numbers
FROM street_numbers
WHERE id_pracownika = (id_pobrany_ze_zmiennej)
AND id_ulicy = (id_pobrany_ze_zmiennej)Łukasz Kowalski edytował(a) ten post dnia 09.08.11 o godzinie 23:01
Temat: Zapytanie do wielu tabel.
Wytłumaczyłbyś mi dlaczego w tym wypadku jest lepszy LEFT JOIN a nie zwykły JOIN jaki robiłem?![](https://static.goldenline.pl/user_photo_basic.jpg)
konto usunięte
Temat: Zapytanie do wielu tabel.
Pisałeś że dopiero się uczysz więc nie będę się wymądrzał. zrob dwie tabelki-users-
id_user
-data_user-
id
name
id_user
W tabelce user wpisz dane dla 3 osob np
id = 1, email = abc@ab.pl
id = 2, email = dwa@abc.pl
id = 3, email = trzy@lalala.pl
w tabelce data user wpisz 5 wpisow
id = 1, name = witkacy, id_user = 3
id = 2, name = pankracy, id_user = 2
id = 3, name = humus, id_user = (pozostaw puste)
id = 4, name = Monic, id_user = 4
id = 5, name = Monic, id_user = 5
wykonaj teraz trzy zapytania
1.
SELECT u.email,du.name
FROM users u
JOIN data_user du ON (du.id_user = u.id_user)
2.
SELECT u.email,du.name
FROM users u
LEFT JOIN data_user du ON (du.id_user = u.id_user)
3.
SELECT u.email,du.name
FROM users u
RIGHT JOIN data_user du ON (du.id_user = u.id_user)
LEWY JOIN zwarca wartosc z lewej tabeli i pasujace wwartosci z prawej a jesli nie maja dopasowania to pojawia sie NULL ale sie pojawi rekord
PRAWY JOIN ze laczy do prawej tabeli to co jest z lewej. Jesli rekordy sa zdublowane pojawia sie dwa ale jesli rekordy nie beda pasowac nie pojawia sie na liscie
tu masz ladnie pokazane czym sie rozni LEFT JOIN od JOIN
http://www.tizag.com/mysqlTutorial/mysqlleftjoin.php
http://www.elektroonline.pl/a/2460/1,Komenda_JOIN_w_ba...Łukasz Kowalski edytował(a) ten post dnia 10.08.11 o godzinie 14:35
Podobne tematy
-
Bazy Danych » Jedno zapytanie do kilku tabel! -
-
Bazy Danych » mySQL -pobieranie danych z wielu tabel dla jednego... -
-
Bazy Danych » MSSQL rozbudowane zapytanie czy 4 zapytania do... -
-
Bazy Danych » Zapytanie w MySQL -
-
Bazy Danych » Zapytanie w SQL -
-
Bazy Danych » [MySQL] Zadać zapytanie do wyników z poprzedniego zapytania. -
-
Bazy Danych » Mysql - zapytanie left join -
-
Bazy Danych » Zapytanie SQL nie działa -
-
Bazy Danych » Problem. Jak napisać zapytanie? -
-
Bazy Danych » Zapytanie w osql - czy można dodać warunek? -
Następna dyskusja: