Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja i poprawne zapytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
koperkuba
  1. --------------------------------------------------------
  2.  
  3. --
  4. -- Struktura tabeli dla `pokoj`
  5. --
  6.  
  7. CREATE TABLE IF NOT EXISTS `pokoj` (
  8. `idPokoju` int(11) NOT NULL,
  9. `wewnetrzny` tinyint(4) DEFAULT NULL,
  10. PRIMARY KEY (`idPokoju`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  12.  
  13. -- --------------------------------------------------------
  14.  
  15. --
  16. -- Struktura tabeli dla `pracownik`
  17. --
  18.  
  19. CREATE TABLE IF NOT EXISTS `pracownik` (
  20. `idPracownik` int(11) NOT NULL AUTO_INCREMENT,
  21. `imie` varchar(50) DEFAULT NULL,
  22. `nazwisko` varchar(100) DEFAULT NULL,
  23. `dyzur` text,
  24. `idPokoju` int(11) DEFAULT NULL,
  25. PRIMARY KEY (`idPracownik`)
  26. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=69 ;
  27.  
  28. -- --------------------------------------------------------
  29.  
  30. --
  31. -- Struktura tabeli dla `ulica`
  32. --
  33.  
  34. CREATE TABLE IF NOT EXISTS `ulica` (
  35. `idUlica` int(11) NOT NULL AUTO_INCREMENT,
  36. `nazwa` varchar(40) DEFAULT NULL,
  37. PRIMARY KEY (`idUlica`)
  38. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=455 ;


Baza wygląda jak powyżej. Założeniem jest:
Miasto podzielone jest na ulice - tzw. rejony. Każdy pracownik ma przypisane ulice (czasem różne) - niektórzy mają przydzielone połowę ulicy (określone numery) a drugą część ma już inny pracownik. Każdy pracownik jest w pokoju, w niektórych pokojach jest ich kilku, każdy pokój ma przydzielony numer wewnętrzny. I teraz chce przypisać te ulice do pracowników - czyli powinienem w tabeli pracownik wpisać pole idUlica? Czy może założyć nową tabelę rejon(idPracownika, idUlica)?
Jeśli wybiorę nazwe ulicy powinno mi się wyświetlić: imię, nazwisko, dyzur, pokoj, wewnetrzny,
Noidea
Relacja wiele-do-wielu między pracownikami a ulicami. W takiej tabeli trzymaj też numery budynków lub NULLe jeśli pracownik ma przypisaną całą ulicę.

Kod
+----------------+-----------+-----------+-----------+
|  idPracownika  |  idUlicy  |  numerOd  |  numerDo  |
+----------------+-----------+-----------+-----------+
|       1        |     1     |    NULL   |    NULL   |
|       1        |     2     |      1    |     20    |
|       2        |     2     |     21    |     40    |
|       2        |     3     |    NULL   |    NULL   |


Zapytanie:
  1. SELECT po.wewnetrzny
  2. FROM pokoj po
  3. JOIN pracownik pr ON ( pr.idPokoju = po.idPokoju )
  4. JOIN przypisane_ulice pu ON ( pu.idPracownika = pr.idPracownika )
  5. WHERE pu.idUlicy = {$idUlicy} AND
  6. ( ( pu.numerOd IS NULL AND pu.numerDo IS NULL ) OR ( {$numerBudynku} BETWEEN pu.numerOd AND pu.numerDo ) )
koperkuba
Z numerami w tabeli łączącej pracowników z ulicami nie przejdzie, ponieważ są czasem ulice, gdzie numery są np. w zakresie ale nieparzyste, albo np. "blok socjalny" czy "wiezienie". Dlatego zrobiłem:
  1. rejon (idPracownika, idUlica, uwaga)


Napisałem swoje zapytanie, wyciągające to co chce, czyli pracownika z danymi dla podanej ulicy (zmienna), ale nie wiem czy nie jest przekombinowane - działa, ale coś mi mój nos początkującego mówi, że to zbyt "na siłę". Prosiłbym o przeanalizowanie poniższego zapytania.

  1. SELECT imie,nazwisko, pokoj.idPokoju,wewnetrzny,dyzur,uwaga
  2. FROM rejon
  3. INNER JOIN pracownik
  4. INNER JOIN pokoj
  5. INNER JOIN ulica
  6. ON rejon.idPracownik=pracownik.idPracownik AND rejon.idUlica=ulica.idUlica AND pracownik.idPokoju=pokoj.idPokoju
  7. WHERE nazwa='$podanaulica'
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.