Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wiele do wielu, sklep, tagi, produkty
Forum PHP.pl > Forum > Bazy danych > MySQL
L00zak
Witajcie, dawno tu nie pisałem, lecz teraz siędzę już 2 dni i nie mogę wymyślić jak napisać zapytanie dla poniższych tabel:

- chcę wyszukać produkty do których są przypisane konkretne tagi
- w wyszukiwarce wpisujemy "monitor myszka"
- pokazuje tylko produkt nr 2, do którego przypisane są oba tagi
- sklep_tags (lista tagów)
- sklep_tagi (tabela łącząca)
- sklep_produ (lista produktów)

Pomóżcie proszę.

  1. -- phpMyAdmin SQL Dump
  2. -- version 3.4.2
  3. -- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
  4. --
  5. -- Host: localhost
  6. -- Czas wygenerowania: 02 Paź 2012, 16:07
  7. -- Wersja serwera: 5.1.63
  8. -- Wersja PHP: 5.3.3-7+squeeze14
  9.  
  10. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  11. SET time_zone = "+00:00";
  12.  
  13. --
  14. -- Baza danych: `sklep`
  15. --
  16.  
  17. -- --------------------------------------------------------
  18.  
  19. --
  20. -- Struktura tabeli dla `sklep_produ`
  21. --
  22.  
  23. CREATE TABLE IF NOT EXISTS `sklep_produ` (
  24. `produ_id` mediumint(9) NOT NULL AUTO_INCREMENT,
  25. `produ_nazwa` char(200) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  26. PRIMARY KEY (`produ_id`)
  27. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  28.  
  29. --
  30. -- Zrzut danych tabeli `sklep_produ`
  31. --
  32.  
  33. INSERT INTO `sklep_produ` (`produ_id`, `produ_nazwa`, ) VALUES
  34. (1, 'monitor belinea xyz'),
  35. (2, 'monitor i myszka'),
  36. (3, 'myszka logitech xyz');
  37.  
  38.  
  39. -- --------------------------------------------------------
  40.  
  41. --
  42. -- Struktura tabeli dla `sklep_tagi`
  43. --
  44.  
  45. CREATE TABLE IF NOT EXISTS `sklep_tagi` (
  46. `tagi_id` mediumint(9) NOT NULL,
  47. `tagi_prod` smallint(9) NOT NULL,
  48. KEY `tagi_id` (`tagi_id`),
  49. KEY `tagi_prod` (`tagi_prod`)
  50. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  51.  
  52. --
  53. -- Zrzut danych tabeli `sklep_tagi`
  54. --
  55.  
  56. INSERT INTO `sklep_tagi` (`tagi_id`, `tagi_prod`) VALUES
  57. (1, 1),
  58. (1, 2),
  59. (2, 2),
  60. (2, 3),
  61. (3, 1),
  62. (3, 3),
  63. (4, 1),
  64. (5, 3);
  65.  
  66. -- --------------------------------------------------------
  67.  
  68. --
  69. -- Struktura tabeli dla `sklep_tags`
  70. --
  71.  
  72. CREATE TABLE IF NOT EXISTS `sklep_tags` (
  73. `tags_id` mediumint(9) NOT NULL AUTO_INCREMENT,
  74. `tags_ile` mediumint(9) NOT NULL,
  75. `tags_name` char(50) NOT NULL,
  76. PRIMARY KEY (`tags_id`)
  77. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  78.  
  79. --
  80. -- Zrzut danych tabeli `sklep_tags`
  81. --
  82.  
  83. INSERT INTO `sklep_tags` (`tags_id`, `tags_ile`, `tags_name`) VALUES
  84. (1, 2, 'monitor'),
  85. (2, 2, 'myszka'),
  86. (3, 2, 'xyz'),
  87. (4, 1, 'belinea'),
  88. (5, 1, 'logitech');
darko
Powinno być na joinach, ale masz na szybko na in:
  1. SELECT DISTINCT * FROM sklep_produ WHERE produ_id IN (SELECT DISTINCT tagi_prod FROM sklep_tagi WHERE tagi_id IN (SELECT tags_id FROM `sklep_tags` WHERE tags_name ='monitor' OR tags_name ='myszka'))

przerób na joiny i powinno działać.
L00zak
na LEFT JOINACH udało mi się zrobić, lecz nie działa gdy zmienię warunek WHERE tags_name ='monitor' AND tags_name ='myszka' ponieważ dwa razy deklaruję to samo tylko z inną wartością, chciałbym aby działało podobnie jak na allegro http://allegro.pl/listing.php/search?strin...&category=0 czyli z AND nie OR

anybody help? sleep.gif
nospor
Wersja skrócona by pokazać idee:
  1. SELECT * FROM produkt p
  2. LEFT JOIN produkt_tag pd1 ON (pd1.id_product=p.id AND pd1.tag_name = 'myszka')
  3. LEFT JOIN produkt_tag pd2 ON (pd2.id_product=p.id AND pd2.tag_name = 'monitor')
  4. WHERE pd1.id_product IS NOT NULL AND pd2.id_product IS NOT NULL

krótko rzecz mowiąc masz dać tyle joinów ile szukasz tagów
L00zak
dzięki, a czy to co poniżej to opytmalne rozwiązanie?

  1. SELECT `produ_id` , `produ_nazwa`
  2. FROM sklep_produ p
  3. LEFT JOIN sklep_tags s1 ON ( s1.tags_name = 'myszka' )
  4. LEFT JOIN sklep_tags s2 ON ( s2.tags_name = 'monitor' )
  5. LEFT JOIN sklep_tagi i1 ON ( s1.tags_id = i1.tagi_id )
  6. LEFT JOIN sklep_tagi i2 ON ( s2.tags_id = i2.tagi_id )
  7. WHERE p.produ_id = i1.tagi_prod
  8. AND p.produ_id = i2.tagi_prod


ścieżka do celu potrafi być długa i krętaaa oneeyedsmiley02.png


  1. SELECT * FROM sklep_produ p
  2. LEFT JOIN sklep_tags s1 ON (s1.tags_name = 'myszka')
  3. LEFT JOIN sklep_tags s2 ON (s2.tags_name = 'monitor')
  4. LEFT JOIN sklep_tagi i ON (i.tagi_id=s1.tags_id AND i.tagi_id=s2.tags_id)
  5. WHERE p.produ_id=i.tagi_prod AND
  6.  
  7.  
  8. SELECT * FROM sklep_produ p
  9. LEFT JOIN sklep_tagi i ON (p.produ_id=i.tagi_prod)
  10. LEFT JOIN sklep_tags s1 ON (s1.tags_name = 'myszka' AND i.tagi_id=s1.tags_id)
  11. LEFT JOIN sklep_tags s2 ON (s2.tags_name = 'monitor' AND i.tagi_id=s2.tags_id)
  12. WHERE i.tagi_id=s1.tags_id AND i.tagi_id=s2.tags_id
  13.  
  14.  
  15. SELECT `produ_id`, `produ_nazwa` FROM sklep_produ p
  16. LEFT JOIN sklep_tagi i ON (p.produ_id=i.tagi_prod)
  17. LEFT JOIN sklep_tags s1 ON (i.tagi_id=s1.tags_id AND s1.tags_name = 'myszka')
  18. LEFT JOIN sklep_tags s2 ON (i.tagi_id=s2.tags_id AND s2.tags_name = 'monitor')
  19.  
  20. SELECT `produ_id`, `produ_nazwa` FROM sklep_produ p
  21. LEFT JOIN sklep_tags s1 ON (s1.tags_name = 'myszka')
  22. LEFT JOIN sklep_tags s2 ON (s2.tags_name = 'monitor')
  23. LEFT JOIN sklep_tagi i ON (s1.tags_id=i.tagi_prod AND s2.tags_id=i.tagi_prod)
  24. WHERE p.produ_id=i.tagi_prod
  25.  
  26.  
  27.  
  28. SELECT `produ_id`, `produ_nazwa` FROM sklep_produ p
  29. LEFT JOIN sklep_tags s1 ON (s1.tags_name = 'myszka')
  30. LEFT JOIN sklep_tags s2 ON (s2.tags_name = 'monitor')
  31. LEFT JOIN sklep_tagi i ON (s1.tags_id=i.tagi_id AND s2.tags_id=i.tagi_id)
  32. WHERE p.produ_id=i.tagi_prod
  33.  
  34.  
  35.  
  36. SELECT `produ_id` , `produ_nazwa`
  37. FROM sklep_produ p
  38. LEFT JOIN sklep_tags s1 ON ( s1.tags_name = 'myszka' )
  39. LEFT JOIN sklep_tags s2 ON ( s2.tags_name = 'monitor' )
  40. LEFT JOIN sklep_tagi i1 ON ( s1.tags_id = i1.tagi_id )
  41. LEFT JOIN sklep_tagi i2 ON ( s1.tags_id = i2.tagi_id )
  42. WHERE p.produ_id = i1.tagi_prod
  43. AND p.produ_id = i2.tagi_prod
  44.  
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.