Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie pobiera kilka razy ten sam rekord ;/
Forum PHP.pl > Forum > Bazy danych > MySQL
pgrzelka
  1. SELECT pr.*, t.tytul,pl.placowka, po.produkt
  2. FROM #__aiba_produkty pr
  3. LEFT JOIN #__aiba_tytuly t ON (pr.tid=t.id)
  4. LEFT JOIN #__aiba_powiazania po ON (po.produkt=pr.id)
  5. LEFT JOIN #__aiba_placowki pl ON (po.placowka=pl.id)
  6. WHERE pr.active='1' ORDER BY pr.date DESC LIMIT 10


powyższe zapytanie ma pobrać wszystkie rekordy z tabeli jos_aiba_produkty
niestety niektóre produkty pobiera 2-3 razy i nie wiem czemu ;/
domyślam się że problem jest z tabelą jos_aiba_powiazania ale nie mam pojęcia gdzie tu jest błąd ;/
z góry dziękuje za pomoc winksmiley.jpg

struktura tabel
  1. CREATE TABLE IF NOT EXISTS `jos_aiba_placowki` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `pid` int(11) NOT NULL,
  4. `cid` int(11) NOT NULL,
  5. `lid` int(11) NOT NULL,
  6. `uid` int(11) NOT NULL,
  7. `active` tinyint(1) NOT NULL,
  8. `placowka` varchar(255) collate utf8_polish_ci NOT NULL,
  9. PRIMARY KEY (`id`),
  10. KEY `pid` (`pid`,`cid`,`lid`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=30 ;
  12.  
  13.  
  14.  
  15. CREATE TABLE IF NOT EXISTS `jos_aiba_powiazania` (
  16. `id` int(11) NOT NULL AUTO_INCREMENT,
  17. `produkt` int(11) NOT NULL,
  18. `placowka` int(11) NOT NULL,
  19. PRIMARY KEY (`id`)
  20. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=38 ;
  21.  
  22.  
  23. CREATE TABLE IF NOT EXISTS `jos_aiba_produkty` (
  24. `id` int(11) NOT NULL AUTO_INCREMENT,
  25. `uid` int(11) NOT NULL,
  26. `tid` int(11) NOT NULL,
  27. `date` int(11) NOT NULL,
  28. `name` varchar(255) collate utf8_polish_ci NOT NULL,
  29. `specjalizacja` tinytext collate utf8_polish_ci NOT NULL,
  30. `ocena` float NOT NULL,
  31. `opinie` int(11) NOT NULL,
  32. `ip` varchar(32) collate utf8_polish_ci NOT NULL,
  33. `active` tinyint(1) NOT NULL,
  34. PRIMARY KEY (`id`)
  35. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=40 ;
  36.  
  37.  
  38. CREATE TABLE IF NOT EXISTS `jos_aiba_tytuly` (
  39. `id` int(11) NOT NULL AUTO_INCREMENT,
  40. `tytul` varchar(128) collate utf8_polish_ci NOT NULL,
  41. PRIMARY KEY (`id`)
  42. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5 ;
konradg
Spróbuj użyć zwykłego
  1. SELECT DISTINCT...
powinno załatwić to Twój problem
pgrzelka
Cytat(konradg @ 10.06.2009, 07:44:44 ) *
Spróbuj użyć zwykłego
  1. SELECT DISTINCT...
powinno załatwić to Twój problem


jak dodam DISTINCT to żadne rekordy mi się nie wyświetlają ;/
nospor
Cytat
powyższe zapytanie ma pobrać wszystkie rekordy z tabeli jos_aiba_produkty
niestety niektóre produkty pobiera 2-3 razy i nie wiem czemu ;/
domyślam się że problem jest z tabelą jos_aiba_powiazania ale nie mam pojęcia gdzie tu jest błąd ;/
Normalka. Jesli tabele joinowane zawierają kilka odniesien do tabeli glownej, to rekordy z glownej powtorza sie wlasnie tyle razy.

Napisz co chcesz osiagnac tym zapytaniem to powiemy ci jak to poprawic
seth-kk
pobiera kilka razy poniewaz produkty maja kilka tytulow lub bardziej prawdopodobne kilka kombinacji powiazan
to ze DISTINCT sobie z tym nie radzi to ciekawe, sprobuj
  1. ..GROUP BY pr.id...
lub poprostu wyczysc baze
pgrzelka
Cytat
Napisz co chcesz osiagnac tym zapytaniem to powiemy ci jak to poprawic


chcę pobrać wszystkie rekordy z tabeli jos_aiba_produkty
każdy produkt może być przypisany do kilku placówek (jos_aiba_placowki) za pomocą powiązań (jos_aiba_powiazania)
każdy produkt może mieć tylko 1 tytuł więc ta tabela tu nic nie wnosi

chciałbym aby zapytanie również działało jeśli wpiszę
WHERE pr.active='1' AND pl.pid='4'
czyli żeby pobrało rekordy z jos_aiba_produkty, które są przypisane do placówek w których pid=4,
wiem że powinienem użyć podzapytań w tym przypadku ale takie rozwiązanie też działa, niestety pobiera kilka razy rekordy z jos_aiba_produkty



chwilowo zastosowałem takie rozwiązanie, niestety takie coś mnie nie satysfakcjonuje, ponieważ jeśli w zapytaniu jest limit=10, to chcę 10 rekordów a poniższy kod usuwa niektóre ;/
  1. <?php
  2. //dane2 - nowe dane, bez powtórzeń
  3. // dane - rekordy pobrane z bazy
  4. $dane2 = array();
  5.            $inuse = array();
  6.            foreach ($dane as $k=>$v)
  7.            {
  8.                if (in_array($v->id,$inuse)) continue;
  9.                $dane2[] = $v;
  10.                $inuse[] = $v->id;
  11.            }
  12.                return $dane2;
  13. ?>
nospor
Cytat
każdy produkt może być przypisany do kilku placówek (jos_aiba_placowki) za pomocą powiązań (jos_aiba_powiazania)
Czyli jak rozumiem chcesz od razu pobrac wszystkie placowki dla danego produktu?
No to zapytanie masz ok. Musisz teraz jedynie jego wyniki odpowiednio obrobic. Tutaj pisalem dokladnie o tym:
http://nospor.pl/grupowanie-wynikow-n35.html
pgrzelka
ja chcę pobrać wszystkie produkty tylko winksmiley.jpg
nospor
no to na grzyba robisz powiazanie do placowek, skoro cie nie interesuja?

Cytat
chciałbym aby zapytanie również działało jeśli wpiszę
WHERE pr.active='1' AND pl.pid='4'

powiazanie do placowki rob tylko wtedy, gdy dajesz ten warunek na placowkę. wowczas pobierze ci to co trzeba

od biedy mozesz uzyc group by o czym pisal seth-kk
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.