Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja i poprawne zapytanie
koperkuba
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 11.06.2007

Ostrzeżenie: (0%)
-----


  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,

Ten post edytował koperkuba 5.08.2011, 07:56:50
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Noidea
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


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 ) )


--------------------
Go to the top of the page
+Quote Post
koperkuba
post
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 11.06.2007

Ostrzeżenie: (0%)
-----


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'


Ten post edytował koperkuba 5.08.2011, 10:46:10
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 04:29