Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skomplikowane zapytanie.
Forum PHP.pl > Forum > Bazy danych > MySQL
jasina
Witam serdecznie

Jestem właśnie w trakcie tworzenia sklepu internetowego i mam pewien problem.

Baza danych składa się z następujących tabeli:

  1. --
  2. -- Struktura tabeli dla 'cechy'
  3. --
  4.  
  5. CREATE TABLE cechy (
  6. id smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  7. id_kategorii smallint(4) NOT NULL DEFAULT '0',
  8. nazwa varchar(50) NOT NULL DEFAULT '',
  9. PRIMARY KEY (id)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  11.  
  12. -- --------------------------------------------------------
  13.  
  14. --
  15. -- Struktura tabeli dla 'cechy_dane'
  16. --
  17.  
  18. CREATE TABLE cechy_dane (
  19. id_produktu smallint(6) NOT NULL DEFAULT '0',
  20. id_cechy smallint(6) NOT NULL DEFAULT '0',
  21. wartosc varchar(255) NOT NULL DEFAULT ''
  22. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  23.  
  24. -- --------------------------------------------------------
  25.  
  26. --
  27. -- Struktura tabeli dla 'kategorie'
  28. --
  29.  
  30. CREATE TABLE kategorie (
  31. id smallint(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  32. nad_id smallint(4) NOT NULL DEFAULT '0',
  33. pozycja smallint(3) NOT NULL DEFAULT '0',
  34. nazwa varchar(50) NOT NULL DEFAULT '',
  35. PRIMARY KEY (id)
  36. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  37.  
  38. -- --------------------------------------------------------
  39.  
  40. --
  41. -- Struktura tabeli dla 'producenci'
  42. --
  43.  
  44. CREATE TABLE producenci (
  45. id smallint(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  46. nazwa varchar(50) NOT NULL DEFAULT '',
  47. PRIMARY KEY (id)
  48. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  49.  
  50. -- --------------------------------------------------------
  51.  
  52. --
  53. -- Struktura tabeli dla 'produkty'
  54. --
  55.  
  56. CREATE TABLE produkty (
  57. id smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  58. id_kategorii smallint(4) NOT NULL DEFAULT '0',
  59. id_producenta smallint(4) NOT NULL DEFAULT '0',
  60. nazwa varchar(50) NOT NULL DEFAULT '',
  61. PRIMARY KEY (id)
  62. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;



I teraz tak chciałbym wyświetlić takie rekordy z tabeli produkty których 'Pojemność dysku twardego' wynosi '80gb'.

Na razie mam następujące zapytanie:

  1. SELECT p.*,pro.nazwa AS nazwa_producenta,kat.nazwa AS nazwa_kategorii
  2. FROM produkty p
  3. JOIN kategorie kat ON (p.id_kategorii = kat.id)
  4. JOIN producenci pro ON (p.id_producenta = pro.id)
  5. JOIN cechy c1 ON (kat.id = c1.id_kategorii)
  6. JOIN cechy_dane c2 ON (p.id = c2.id_produktu AND c1.id = c2.id_cechy)


Jak dodać instrukcje warunkową do tego zapytania, tak aby wybrać tylko rekordy, których dla przykładu 'Pojemność dysku twardego' wynosi '80gb'.

Poniżej daje zrzut bazy żebyście widzieli co aktualnie w niej jest:

  1. --
  2. -- Zrzut danych tabeli `cechy`
  3. --
  4.  
  5. INSERT INTO `cechy` VALUES (1, 1, 'Pojemność dysku twardego');
  6. INSERT INTO `cechy` VALUES (2, 1, 'Przekątna ekranu');
  7.  
  8. --
  9. -- Zrzut danych tabeli `cechy_dane`
  10. --
  11.  
  12. INSERT INTO `cechy_dane` VALUES (1, 1, '80 gb');
  13. INSERT INTO `cechy_dane` VALUES (1, 2, '14.1"');
  14.  
  15. --
  16. -- Zrzut danych tabeli `kategorie`
  17. --
  18.  
  19. INSERT INTO `kategorie` VALUES (1, 0, 0, 'Laptopy');
  20.  
  21. --
  22. -- Zrzut danych tabeli `producenci`
  23. --
  24.  
  25. INSERT INTO `producenci` VALUES (1, 'Toshiba');
  26.  
  27. --
  28. -- Zrzut danych tabeli `produkty`
  29. --
  30.  
  31. INSERT INTO `produkty` VALUES (1, 1, 1, 'HP Compaq nx6110');


Czekam na propozycje i pomoc.
jarrod
  1. SELECT
  2. p.*, pro.`nazwa` AS nazwa_producenta, kat.`nazwa` AS nazwa_kategorii
  3. FROM produkty AS p
  4. INNER JOIN kategorie AS kat ON p.`id_kategorii` = kat.`id`
  5. INNER JOIN producenci AS pro ON p.`id_producenta` = pro.`id`
  6. INNER JOIN cechy AS c1 ON kat.`id` = c1.`id_kategorii`
  7. INNER JOIN cechy_dane AS c2 ON p.`id` = c2.`id_produktu` AND c1.`id` = c2.`id_cechy`
  8. WHERE c2.`wartosc` LIKE '80 gb'
  9. GROUP BY ``
  10. -- tutaj możesz pogrupować wyniki
  11. ORDER BY ``
  12. -- tutaj sortujesz wyniki
  13. LIMIT ``
  14. -- a tutaj usatalasz limit zapytań
jasina
No a co się stanie jeśli cechy będą takie:

'Prędkość zapisu'
'Prędkość odczytu'

i te cechy dla jednego produktu przyjmą takie same wartości np. '24x'.

To jak w takim przypadku wybrać produkty których 'Prędkość zapisu' jest równa 24x bo to co napisałeś zdaje się, że sprawdza czy wartość którejkolwiek z cech ma jakąś wartość.

Mam nadzieję, że dobrze to wyjaśniłem smile.gif.
jarrod
wówczas używasz warunków. Przenosisz zmienną mówiącą ci po czym szukasz eg:
  1. <?php
  2. $sql = "SELECT p.*, pro.`nazwa` AS nazwa_producenta, kat.`nazwa` AS nazwa_kategorii FROM produkty as p
  3. INNER JOIN kategorie as kat ON p.`id_kategorii` = kat.`id` 
  4. INNER JOIN producenci as pro ON p.`id_producenta` = pro.`id`
  5. INNER JOIN cechy as c1 ON kat.`id` = c1.`id_kategorii` 
  6. INNER JOIN cechy_dane as c2 ON p.`id` = c2.`id_produktu`
  7. WHERE
  8. ";
  9.  
  10. if($szukaj_po_wielkosci != '')
  11. {
  12.  $sql .= " c2.`wartosc` LIKE '{$szukaj_po_wielkosci }' AND c1.`id` = c2.`id_cechy`' AND c1.`nazwa`like'nazwa_cechy' OR";
  13. }
  14. if($szukaj_po_preskosci_odczytu )
  15. {
  16.  $sql .= " c2.`wartosc` LIKE '{$szukaj_po_preskosci_odczytu }' AND c1.`id` = c2.`id_cechy` AND c1.`nazwa`like'nazwa_cechy' OR";
  17. }
  18. // i tak dalej
  19.  
  20. $sql = substr($sql,0,strlen($sql)-3); // pozbycie się ostatniego "OR"
  21. ?>


w formularzu określ sobie ID cechy po której wyszukujesz i zmień wówczas wyszukiwanie aby nie szukał po nazwie tylko po ID (szybciej dla bazy jeśli masz indexy)
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.