Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySql] Wielokrotne złączenie do jednej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
mariuszg
Cześć,

Mam problem z wyciągnięciem danych z bazy:
Chodzi mi o wyszukiwanie miejscowości w tabeli simc + zaciągnięcie z tabeli terc powiatu i województwa. Po złączeniu mam powiaty ale nie daje rady dodać jeszcze województwa.
Proszę o pomoc.

Tak to wygląda:

  1. SELECT
  2. simc.nazwa AS miejscowosc,
  3. terc.nazwa AS powiat,
  4. terc.nazdod AS nazwa_dodtkowa,
  5. simc.woj AS id_wojewodztwo,
  6. terc.nazwa AS nazwa_wojewodztwo
  7.  
  8. FROM simc
  9.  
  10. LEFT JOIN terc ON
  11.  
  12. terc.woj = simc.woj AND
  13. terc.pow = simc.pow AND
  14. terc.gmi = simc.gmi
  15.  
  16. WHERE simc.nazwa LIKE 'wrąbczyn'


wynik zapytania:




tabela simc:



tabela terc:

trueblue
Wynik jest prawidłowy. Zobacz jakie masz dane w tabeli terc dla woj=02, pow=02, gmi=03.

Połącz jeszcze raz z tabelą terc (dwa JOINY do tej samej tabeli), ale z warunkiem na puste pow, gmi, rodz.
mariuszg
Dodałem jedno złączenie bo przy dwóch miałem więcej wierszy. Wynik jest poprawny. Pytanie czy tak mogę to zostawić. Czy to jest optymalne zapytania.
Wielkie dzięki za pomoc.

  1. SELECT
  2. simc.nazwa AS miejscowosc,
  3. terc.nazwa AS powiat,
  4. terc.nazdod AS nazwa_dodtkowa,
  5. simc.woj AS id_wojewodztwo,
  6. w.nazwa AS nazwa_wojewodztwo
  7.  
  8. FROM simc
  9.  
  10. LEFT JOIN terc ON
  11.  
  12. terc.woj = simc.woj AND
  13. terc.pow = simc.pow AND
  14. terc.gmi = simc.gmi
  15.  
  16. LEFT JOIN terc w ON w.woj = simc.woj
  17.  
  18. WHERE simc.nazwa LIKE 'wrąbczyn'
  19.  
  20. AND w.pow = ''
  21. AND w.gmi = ''
  22. AND w.rodz = ''



trueblue
Pokaż kawałki obydwóch tabeli, które odpowiadają miejscowości Wrąbczyn.
mariuszg
simc:

terc:
trueblue
Jest tam (w terc) rekord odpowiadający wypełnieniu DOLNOŚLĄSKIE?
Czyli: woj=30, pow=gmi=rodz='' ?
mariuszg
jest:

trueblue
  1. SELECT
  2. simc.nazwa AS miejscowosc,
  3. terc.nazwa AS powiat,
  4. terc.nazdod AS nazwa_dodtkowa,
  5. simc.woj AS id_wojewodztwo,
  6. terc.nazwa AS nazwa_wojewodztwo
  7.  
  8. FROM simc
  9.  
  10. LEFT JOIN terc ON
  11.  
  12. (terc.woj = simc.woj AND
  13. terc.pow = simc.pow AND
  14. terc.gmi = simc.gmi)
  15.  
  16. OR
  17.  
  18. (terc.woj = simc.woj AND
  19. terc.pow = '' AND
  20. terc.gmi = '')
  21.  
  22. WHERE simc.nazwa='wrąbczyn'


Nie przeszkadza Ci, że masz Zagórów 3-4 razy?
mariuszg
Twoje zapytanie z uwagi na OR zwraca województwo w osobnym wierszu:


Przeszkadzają mi te powtórzenia.
Myślałem dać tak: GROUP BY terc.nazwa ale wydajniej byłoby chyba usunąć je z tabeli bo ich nie potrzebuje
trueblue
Czy rodzaj ma dla Ciebie znaczenie? Jeśli tak, to który ma być wybrany?
mariuszg
Rodzaj nie ma znaczenia.
Potrzebuję wyłącznie miejscowość, powiat, województwo - muszę pamiętać o tym że miejscowości mają różne rodzaje i w większości wypadków dla danej miejscowości występuje jeden różny rodzaj
trueblue
  1. SELECT
  2. simc.nazwa AS miejscowosc,
  3. terc.nazwa AS wojewodztwo,
  4. terc2.nazwa AS powiat,
  5. terc3.nazwa AS gmina
  6. FROM simc
  7. INNER JOIN terc ON terc.woj = simc.woj
  8. INNER JOIN terc AS terc2 ON terc2.pow = simc.pow
  9. INNER JOIN terc AS terc3 ON terc3.gmi = simc.gmi
  10. WHERE simc.nazwa='Wrąbczyn'
  11. GROUP BY simc.id

Sprawdź dla innych miejscowości.
mariuszg
to zapytanie wykonuje się 16s i zwraca błędne wyniki dla powiatu i gminy

Wrąbczyn, WIELKOPOLSKIE, wrocławski, Podgórzyn
trueblue
A tak?

  1. SELECT
  2. simc.nazwa AS miejscowosc,
  3. terc.nazwa AS wojewodztwo,
  4. terc2.nazwa AS powiat,
  5. terc3.nazwa AS gmina
  6. FROM simc
  7. INNER JOIN terc ON terc.woj = simc.woj
  8. INNER JOIN terc AS terc2 ON terc2.woj = simc.woj AND terc2.pow = simc.pow
  9. INNER JOIN terc AS terc3 ON terc3.woj = simc.woj AND terc3.pow = simc.pow AND terc3.gmi = simc.gmi
  10. WHERE simc.nazwa='Wrąbczyn'
  11. GROUP BY simc.id
mariuszg
działa poprawnie ale 10s
zrobiłem tak:

Odchudziłem tabelę tworząc nową

  1. INSERT teryt.terc2 (woj, pow, nazwa)
  2. SELECT woj, pow, nazwa FROM teryt.terc
  3. GROUP BY woj, pow


i poprawiłem zapytani:
  1. SELECT
  2.  
  3. simc.nazwa AS miejscowosc,
  4. terc2.nazwa AS powiat,
  5. w.nazwa AS nazwa_wojewodztwo
  6.  
  7. FROM simc
  8.  
  9. LEFT JOIN terc2 ON
  10.  
  11. terc2.woj = simc.woj AND
  12. terc2.pow = simc.pow
  13.  
  14. LEFT JOIN terc2 w ON w.woj = simc.woj
  15.  
  16. WHERE simc.nazwa LIKE 'Wrąbczyn'
  17.  
  18. AND w.pow = ''


czas wykonania zapytania to 0,0001
trueblue
A były pozakładane indeksy?
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.