Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] problem z zapytaniem
wybczu
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 16.11.2005

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
wijet
post
Post #2





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 20.12.2005
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
wybczu
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 16.11.2005

Ostrzeżenie: (0%)
-----


  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...
Go to the top of the page
+Quote Post
mwojcik
post
Post #4





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wybczu
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 16.11.2005

Ostrzeżenie: (0%)
-----


probowalem to rozwiazac w ten sam sposob co w poscie wyzej i doswiadczylem tych samych problemow :/

I'm confused... co_jest.gif
Go to the top of the page
+Quote Post
wijet
post
Post #6





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 20.12.2005
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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ą.

Ten post edytował wijet 24.08.2007, 20:43:01


--------------------
Go to the top of the page
+Quote Post
wybczu
post
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 16.11.2005

Ostrzeżenie: (0%)
-----


wielkie dzieki smile.gif

bedę mógł spać spokojnie winksmiley.jpg
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 04:29