Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Produkt z obrazkiem
Forum PHP.pl > Forum > Bazy danych > MySQL
payonk
Witam
Mam problem z zapytaniem SQL'owym.

Chce wyświetlić wszystkie produkty z odpowiadającymi im obrazkami.

[obrazek] [nazwa produktu]
[obrazek] [nazwa produktu]
[obrazek] [nazwa produktu]

- Każdy produkt może mieć wiele obrazków
- Chce wyświetlić tylko jeden obrazek przy każdym produkcie
- Jeden z wielu obrazków produktu może być oznaczony jako główny.
- Jeżeli jeden z obrazków produktu jest oznaczony jako główny, powinien być wyświetlony
- Jeżeli żaden z obrazków nie jest oznaczony jako główny wyświetlić się powinien pierwszy z brzegu smile.gif

Czyli
[produkt]
id_produkt
nazwa

[Obrazek]
id_obrazek
nazwa
czy_glowny
id_produkt

produkt.id_obrazek->obrazek.id_obrazek (relacja 1 do wielu)
produkt.czy_glowny przyjmuje wartości 1 lub 0

Czy ktoś może wie jak skonstruować zapytanie SQL (MySQL) najlepiej z wykorzystaniem JOIN ?
Nostress
id_obrazek to oczywiście id produktu, do którego należy obrazek? Jeśli tak, to proszę:

  1. SELECT produkt.nazwa, obrazek.nazwa FROM produkt LEFT JOIN obrazek ON obrazek.id_obrazek=produkt.id_produkt ORDER BY produkt.id_produkt, obrazek.czy_glowny DESC
payonk
Namieszałem trochę smile.gif przepraszam.
W pierwszej wiadmości poprawiłem wygląd tabel.
Nostress
Zmiana jest niewielka w takim razie... winksmiley.jpg

  1. SELECT produkt.nazwa, obrazek.nazwa FROM produkt LEFT JOIN obrazek ON obrazek.id_produkt=produkt.id_produkt ORDER BY produkt.id_produkt, obrazek.czy_glowny DESC
payonk
Nie sprawdzałem ale z tego co widzę to w momencie kiedy produkt posiada 30 obrazków, produkt wyświetli się 30 razy, a oczywiście powinien raz.

Wiem że można teraz pogrupować wyniki po produkt.id_produkt ale są 2 ale.

1 Nie jest to optymalne
2 Co z obrazkiem głównym, jeżeli istnieje powinien się wyświetlić właśnie on, a jeżeli wszystkie obrazki danego produktu mają flagę glowny ustawioną na 0 to powinien się wyświetlić pierwszy z brzegu.
Nostress
Wyświetli się tylko produkt z jednym obrazkiem. A koncówka, tj. ORDER BY produkt.id_produkt, obrazek.czy_glowny DESC odpowiada za to, żeby w "kolejce" obrazków najpierw były te "główne".

Najpierw sprawdź, później pytaj.
payonk
Ok wyświetla się tylko jeden. Ale niestety są złe wyniki.

Zapytanie wykonałem na bazie:

  1. CREATE TABLE `obrazek` (
  2. `id_obrazek` int(11) NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(32) NOT NULL,
  4. `id_produkt` int(11) NOT NULL,
  5. `czy_glowny` tinyint(1) NOT NULL,
  6. PRIMARY KEY (`id_obrazek`)
  7. );
  8.  
  9. INSERT INTO `obrazek` (`id_obrazek`, `nazwa`, `id_produkt`, `czy_glowny`) VALUES (1, 'pierwszy obrazek rowera', 1, 0),
  10. (2, 'drugi obrazek rowera', 1, 1),
  11. (3, 'czeci rower', 1, 0),
  12. (4, 'pierwszy motur', 2, 1),
  13. (5, 'dugi motur', 2, 0);
  14.  
  15. CREATE TABLE `produkt` (
  16. `id_produkt` int(11) NOT NULL AUTO_INCREMENT,
  17. `nazwa` varchar(20) NOT NULL,
  18. PRIMARY KEY (`id_produkt`)
  19. );
  20.  
  21. INSERT INTO `produkt` (`id_produkt`, `nazwa`) VALUES (1, 'rower'),
  22. (2, 'motur');


dostaję taki wynik:

[produkt.nazwa] [obrazek.nazwa]
rower pierwszy obrazek rowera
motur drugi obrazek rowera
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.