Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] problem z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
wybczu
mam maly problem, a mianowiecie:
mam dwie tabele w bazie danych:

produkty:
Kod
id | photo  | catID
-------------------
1  | p1.jpg | 1
2  | p2.jpg | 1
3  | p3.jpg | 2
4  | p4.jpg | 1


kategorie:
Kod
id | name
---------------
1  | kategoria1
2  | kategoria2


teraz w wyniku zapytania chcialbym otrzymac
Kod
kategoriaID | photo
---------------------
1          | p1.jpg
2          | p3.jpg


gdzie dla id kategorii 1 za kazdym razem zapytanie ma mi zwracac losowe photo
z tabeli produkty...

mecze sie z tym i mecze... juz nie mam pomyslow jak to zrobic... sad.gif

pomocy...
wijet
Może:
  1. SELECT photo FROM produkty WHERE catID = 1 ORDER BY RAND() LIMIT 1

nie jestem pewien czy jest to do końca poprawne.
wybczu
  1. SELECT photo FROM produkty WHERE catID = 1 ORDER BY RAND() LIMIT 1


niestety to nie to... sad.gif chodzi mi o to zeby za pomoca jednego zapytania przyporzadkowac losowe zdjecie kazdej kategorii...
mwojcik
Interesujacy przypadek.
Po namysle sprobowalem takiego zapytania, jednak najbardziej zastanawiajace sa wyniki :
  1. mysql> SELECT products.photo, categories.name, categories.id AS category_id FROM products INNER JOIN categories ON products.catid = categories.id
  2. WHERE products.id = (SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1 )
  3. GROUP BY categories.name, products.photo, categories.id; +--------------+-------------+-------------+
  4. | photo | name | category_id |
  5. +--------------+-------------+-------------+
  6. | picture1.jpg | kategoria 1 | 1 |
  7. | picture2.jpg | kategoria 1 | 1 |
  8. | picture3.jpg | kategorie 2 | 2 |
  9. +--------------+-------------+-------------+
  10. 3 rows IN SET (0,00 sec)
  11.  
  12. mysql> SELECT products.photo, categories.name, categories.id AS category_id FROM products INNER JOIN categories ON products.catid = categories.id
  13. WHERE products.id = (SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1 )
  14. GROUP BY categories.name, products.photo, categories.id;
  15. +--------------+-------------+-------------+
  16. | photo | name | category_id |
  17. +--------------+-------------+-------------+
  18. | picture3.jpg | kategorie 2 | 2 |
  19. +--------------+-------------+-------------+
  20. 1 row IN SET (0,00 sec)
  21.  
  22. mysql> SELECT products.photo, categories.name, categories.id AS category_id FROM products INNER JOIN categories ON products.catid = categories.id
  23. WHERE products.id = (SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1 )
  24. GROUP BY categories.name, products.photo, categories.id;
  25. +--------------+-------------+-------------+
  26. | photo | name | category_id |
  27. +--------------+-------------+-------------+
  28. | picture1.jpg | kategoria 1 | 1 |
  29. | picture3.jpg | kategorie 2 | 2 |
  30. +--------------+-------------+-------------+
  31. 2 rows IN SET (0,01 sec)

Przy czym zapytanie
  1. SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1

zawsze zwraca poprawnie jeden rekord z losowym id.
Czyli jak widac zapytanie za kazdym razem zwraca inna wartosc (po kolejnych uruchomianiach wyniki ilosc zwroconych rekordow jest losowa - od 1 do 3) - choc na moje oko to powinno zawsze zwracac 2.
Niestety nie wiem czego to jest wina, ale z checia sie dowiem rozwiazania problemu i jak ktos ma jakies uwagi dlaczego tak sie dzieje z zapytaniem powyzszym to z checia poczytam.
wybczu
probowalem to rozwiazac w ten sam sposob co w poscie wyzej i doswiadczylem tych samych problemow :/

I'm confused... co_jest.gif
wijet
Cytat(wybczu @ 24.08.2007, 16:25:17 ) *
  1. SELECT photo FROM produkty WHERE catID = 1 ORDER BY RAND() LIMIT 1


niestety to nie to... sad.gif chodzi mi o to zeby za pomoca jednego zapytania przyporzadkowac losowe zdjecie kazdej kategorii...

Nie spojrzałem na przykład smile.gif

  1. SELECT products.photo, categories.name, categories.id AS category_id FROM products INNER JOIN categories ON products.catid = categories.id
  2. WHERE products.id = (SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1 )
  3. GROUP BY categories.name, products.photo, categories.id;


Podane zapytanie dziala poprawnie, czyli po złączeniu tabel kategorii i produktów, dla każdego rekordu z złączonej tabeli wykonuje zapytanie
  1. SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1

które zwraca losowe id produktu z danej kategorii, jesli id sie zgadza to ok, jesli nie taki rekord jest usuwany z wyniku.
Dlatego w kategoriach w których jest jeden produkt, jest on zawsze wybierany, a jesli produktów jest więcej bywa rożnie smile.gif
Jest to tzw. zapytanie skolerowane, podzapytanie odwołuje się do pola z zapytania nadrzędnego. Dlaczego to podzapytanie wykonywane jest dla każdego rekordu z tabeli złączonej?, ponieważ przekazujemy do niego categories.id co powoduje ze podzapytanie jest inne dla każdego rekordu z tabeli złączonej.

Takie zapytanie powinno się działać
  1. SELECT * FROM (SELECT cat_id,p.photo FROM produkty p,kategorie k WHERE p.cat_id = k.id ORDER BY RAND() ) a GROUP BY a.cat_id;

ale jest średnio losowe ponieważ nie są mieszane produkty w danej kategorii,tylko wszystkie razem. Myślę ze lepiej można rozwiązać ten problem procedurką.
wybczu
wielkie dzieki smile.gif

bedę mógł spać spokojnie winksmiley.jpg
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.