Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dwa i wiecej warunkow na jednym polu
Forum PHP.pl > Forum > Bazy danych > MySQL
Lardux
witam

opis:
mam table z pokojami, oraz tabele z wyposazeniem, polaczone one sa za pomoca tabeli mieszajacej

problem:
chce zrobic wyszukiwarke - ma ona wyszukac te pokoje ktore maja na wyposazeniu np telewizor i telefon

tabele:
  1. CREATE TABLE `t_pokoje` (
  2. `p_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `p_nr` int(11) NOT NULL DEFAULT '0',
  4. `p_il_osob` int(11) NOT NULL DEFAULT '0',
  5. PRIMARY KEY (`p_id`)
  6. ) TYPE=MyISAM;
  7.  
  8. CREATE TABLE `t_mieszajaca` (
  9. `id` int(11) NOT NULL AUTO_INCREMENT,
  10. `p_id` int(11) NOT NULL DEFAULT '0',
  11. `w_id` int(11) NOT NULL DEFAULT '0',
  12. PRIMARY KEY (`id`)
  13. ) TYPE=MyISAM;
  14.  
  15. CREATE TABLE `t_wyposazenie` (
  16. `w_id` int(11) NOT NULL AUTO_INCREMENT,
  17. `w_nazwa` varchar(100) NOT NULL DEFAULT '',
  18. PRIMARY KEY (`w_id`)
  19. ) TYPE=MyISAM;
  20.  
  21. INSERT
  22. INTO `t_pokoje` (p_id, p_nr, p_il_osob) VALUES (1, 1, 1);
  23. INSERT
  24. INTO `t_pokoje` (p_id, p_nr, p_il_osob) VALUES (2, 2, 2);
  25. INSERT
  26. INTO `t_pokoje` (p_id, p_nr, p_il_osob) VALUES (3, 3, 3);
  27.  
  28. INSERT
  29. INTO `t_mieszajaca` (id, p_id, w_id) VALUES (1, 1, 1);
  30. INSERT
  31. INTO `t_mieszajaca` (id, p_id, w_id) VALUES (2, 1, 2);
  32. INSERT
  33. INTO `t_mieszajaca` (id, p_id, w_id) VALUES (3, 2, 1);
  34. INSERT
  35. INTO `t_mieszajaca` (id, p_id, w_id) VALUES (4, 3, 3);
  36.  
  37. INSERT
  38. INTO `t_wyposazenie` (w_id, w_nazwa) VALUES (1, "Telefon");
  39. INSERT
  40. INTO `t_wyposazenie` (w_id, w_nazwa) VALUES (2, "Telewizor");
  41. INSERT
  42. INTO `t_wyposazenie` (w_id, w_nazwa) VALUES (3, "Lampka");


i teraz, jak powinno wygladac zapytanie ktore wyswietli mi jeden rekord - nie wiecej tylko jeden, wyswietlajacy wszystkie dane z tabeli t_pokoje, okreslajacy pokoj ktory ma telefon i telewizor - czyli de facto pokoj nr 1?questionmark.gif

----edit----
Proszę używać odpowiednich tagów bbCode.
~mike_mech
ghostrider
  1. SELECT DISTINCT t_pokoje.*
  2. FROM t_pokoje , t_mieszajaca
  3. , t_mieszajaca AS m1
  4. , t_wyposazenie AS w1
  5. , t_mieszajaca AS m2
  6. , t_wyposazenie AS w2
  7.  
  8. WHERE t_pokoje.p_id=t_mieszajaca.p_id AND t_pokoje.p_id=m1.p_id AND m1.w_id=w1.w_id AND w1.w_id=1 /* 1 = telefon */ AND t_pokoje.p_id=m2.p_id AND m2.w_id=w2.w_id AND w2.w_id=2 /* 2 = telewizor */


;]
Lardux
ok, niby problem rozwiazany, ale jak bys to zrobil w c++/php i za pomoca checkboxow? przeciez jesli w tabeli wysposazenie bede mial 10 pozycji, i user bedzie je wlaczal / wylaczal to w pewnym momencie bede mial 10 aliasow dla kazdej tabeli i sql'a dluzszego niz tur de polone...

nie ma innej mozliowsci ?
ghostrider
Nie użuwałbym checkboxów, zajmują duzo miejsca.
select bedzie lepszy.
  1. <select name='wyposazenie[]' size="6" multiple="MULTIPLE">
  2. <!-- z bazy wypisujemy -->
  3. <option value="1"> Telewizor </option>
  4. .....
  5. <option value="n"> nocnik </option>


a w php

  1. <?php
  2.  
  3. foreach ( $wyposazenie as $key => $id ) {
  4. $from .= sprintf("
  5. t_mieszajaca AS m%d, 
  6. t_wyposazenie AS w%d", 
  7. $key, $key
  8. );
  9. $where .= sprintf("
  10. AND t_pokoje.p_id=m%d.p_id
  11. AND m%d.w_id=w%d.w_id
  12. AND w%d.w_id= %d",
  13. $key, $key, $key, $key, $id);
  14. }
  15.  
  16. $sql = sprintf(
  17. SELECT DISTINCT
  18. t_pokoje.*
  19. FROM
  20. t_pokoje
  21. , t_mieszajaca, 
  22.  %s
  23. WHERE
  24. t_pokoje.p_id=t_mieszajaca.p_id
  25. %s ",
  26.  $form, $where );
  27. ?>


ten kod moze miec błedy, nie tesowałem, ale co do zasady jest dobry ;]

to rozaj zapytania happy-loopy, z glupa sprawdzilem na 40 elementach wyposarzenia i zappytanie zajelo 0,09 sekundy,
szybko questionmark.gif
Lardux
w builderze to bedzie ciezko zrobic.. narazie nie testuje, sprobuje przerobic na c++
Kinool
nieco okrojona wersja zapytania przedstawionego przez ghostridera:
  1. SELECT p1.*
  2. FROM t_pokoje AS p1, t_mieszajaca AS m1, t_mieszajaca AS m2
  3. WHERE p1.p_id=m1.p_id AND p1.p_id=m2.p_id AND m1.w_id=1 AND m2.w_id=2


a tak na marginesie tabela laczaca (t_mieszajaca) moze byc taka:
  1. CREATE TABLE `temp` (
  2. `p_id` INT NOT NULL ,
  3. `w_id` INT NOT NULL ,
  4. PRIMARY KEY ( `p_id` , `w_id` )
  5. ) TYPE = MYISAM ;
dodatkowe pole id nie jest tam wymagne jezli w zalozeniu bedzie to ze w jedym pokoju znajduje sie jeden przedmiot danego typu smile.gif, tzn moze to tez obejsc definiujac np dwa telewizory w pokoju jako dodatkowy przedmio smile.gif

kluczem glownym jest polaczenie dwuch encji (teoretycznie nie powielajacych sie, wiec razem stanowia pole unikalne)
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.