Temat: Zapytanie do wielu tabel.

Nie wiem czy można linkować, ale może ktoś by mi pomógł z
tematem?
Marcin Mackiewicz

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

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

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

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?

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
email

-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

Następna dyskusja:

Jedno zapytanie do kilku ta...




Wyślij zaproszenie do