Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Niewytłumaczone zjawisko z ZAPYTANIEM ?
Forum PHP.pl > Forum > Bazy danych > MySQL
luckyluc
Wykonałem mały system produktów. Dodaje produkt do tabeli "PRODUKTY", a następnie kiedy znam nr ID produktu dodaje zdjęcia do tabeli "ZDJECIA" podając znany juz nr ID produktu.


produkty

produkty_id | produkty_nazwa | produkty_opis | produkty_status | produkty_pozycja

1 | gruszka | zielona | 1 | 0
2 | banan | zolty | 1 | 0

zdjecia

zdjecia_id | zdjecia_plik | zdjecia_produkt

1 | sd323.jpg | 1
2 | fd334.jpg | 1
3 | gh42.jpg | 1
4 | ss11.jpg | 1
5 | df89.jpg | 2


Poniższe zapytanie miało wyświetlić produkt i pierwsze dodane zdjęcie z tabeli "zdjecia":

  1. $zapytanie = mysql_query("SELECT * FROM produkty LEFT JOIN zdjecia ON (zdjecia_produkt=produkty_id) WHERE produkty_status = \"1\" GROUP BY produkty_id ORDER BY produkty_pozycja DESC, produkty_nazwa ASC");


Na początku wszystko było OK. Wyświetlały się produkty i przy nich pierwsze dodane zdjęcia, ale gdy w bazie było już ponad 500 produktów przy niektórych produktach zaczęły pojawiać się inne niż pierwsze fotki. Porównywałem poszczególne rekordy i niczym się nie różnią! Nie mogę znaleźć reguły występowania tego błędu.

Co może być źle? Proszę o podpowiedź.
specialplan
produkty_pozycja?

Nie widze tego w strukturze bazy, ktora podajesz.
luckyluc
Jest takie pole do określania pozycji danego produktu. Opcja ta jest wylaczona i wartosc dla wszystkich produktów wynosi "0" czyli jest taka sama. To nie stanowi.

Ps. Dodalem to pole do struktury, zeby nie bylo bledu w zapytaniu. Mimo wszystko
specialplan
Jednak stanowi. Sortujesz uzywajac tego pola jako kryterium, podczas gdy wartosci sa ustawione na '0', czyli tak naprawde nie sortujesz tym polem. Dodaj do ORDER id zdjecia ASC i powinno byc OK.
luckyluc
Nie ma to żadnego znaczenia! Sprawdzałem to wielokrotnie decydując się na posta na forum. Problem jest bardziej złożony. Jeżeli Twoim zdaniem ma to znaczenie to wytłumacz dlaczego 90% produktów dobrze wyświetla pierwsze zdjęcie, a 10% źle?

Ps. Na potwierdzenie przy takim zapytaniu dzieje się tak samo, a tu kryteria nie mają nic do rzeczy, bo rekord jest jeden:


  1. $zapytanie = mysql_query("SELECT * FROM produkty LEFT JOIN zdjecia ON (zdjecia_produkt=produkty_id) WHERE produkty_status = \"1\" AND produkty_id = \"$id\" GROUP BY produkty_id");
wicy
Cytat(luckyluc @ 8.02.2008, 19:57:32 ) *
Nie ma to żadnego znaczenia! Sprawdzałem to wielokrotnie decydując się na posta na forum. Problem jest bardziej złożony. Jeżeli Twoim zdaniem ma to znaczenie to wytłumacz dlaczego 90% produktów dobrze wyświetla pierwsze zdjęcie, a 10% źle?

Ps. Na potwierdzenie przy takim zapytaniu dzieje się tak samo, a tu kryteria nie mają nic do rzeczy, bo rekord jest jeden:


  1. $zapytanie = mysql_query("SELECT * FROM produkty LEFT JOIN zdjecia ON (zdjecia_produkt=produkty_id) WHERE produkty_status = \"1\" AND produkty_id = \"$id\" GROUP BY produkty_id");


W zapytaniu nie ma zadnego wskazania, które zdjęcie ma znaleźć się w wyniku zapytania.
Może lepiej działalo by coś takiego?

  1. $zapytanie = mysql_query("SELECT * FROM produkty, zdjecia LEFT JOIN zdjecia ON (zdjecia_produkt=produkty_id) WHERE produkty_status = \"1\" AND produkty_id = \"$id\" AND zdjecia_id = \"1\" GROUP BY produkty_id");


Z tym, że zdjęcia winny być numerowane w ramach grupy produktów zawsze od 1.
luckyluc
Cytat(wicy @ 9.02.2008, 12:06:00 ) *
W zapytaniu nie ma zadnego wskazania, które zdjęcie ma znaleźć się w wyniku zapytania.
Może lepiej działalo by coś takiego?

  1. $zapytanie = mysql_query("SELECT * FROM produkty, zdjecia LEFT JOIN zdjecia ON (zdjecia_produkt=produkty_id) WHERE produkty_status = \"1\" AND produkty_id = \"$id\" AND zdjecia_id = \"1\" GROUP BY produkty_id");


Z tym, że zdjęcia winny być numerowane w ramach grupy produktów zawsze od 1.



Dzięki za zainteresowanie problemem, ale to nie rozwiązanie.



Może inaczej. Jak ustawić dla LEFT JOIN zdjecia ON (zdjecia_produkt=produkty_id) aby dołączył jeden rekord o najniższej wartości zdjecia_id. Sens logiczny odnosi się oczywiście do następującego zapytania:


  1. $zapytanie = mysql_query("SELECT * FROM produkty LEFT JOIN zdjecia ON (zdjecia_produkt=produkty_id) WHERE produkty_status = \"1\" GROUP BY produkty_id ORDER BY produkty_pozycja DESC, produkty_nazwa ASC");
heaven
ja bym to zrobil tak. U ciebie jest "GROUP BY produkty_id" ale mysql nie daje pewnosci w jakiej kolejnosci beda wiersze po zgrupowanu i czy pierwszy wystepujacy bedzie tym zgrupowanym i moim zdaniem stad sie bierze ten blad

  1. SELECT *
  2. FROM produkty LEFT JOIN (SELECT MIN(zdjecia_id) AS zdjecia_id,zdjecia_produkt
  3. FROM zdjecia GROUP BY zdjecia_produkt) AS min_id_zdjecia_przedmiotu ON (min_id_zdjecia_przedmiotu.zdjecia_produkt=produkty.produkty_id)
  4. LEFT JOIN zdjecia ON (min_id_zdjecia_przedmiotu.zdjecia_id = zdjecia.zdjecia_id)
  5. WHERE produkty_status = 1 ORDER BY produkty_pozycja DESC, produkty_nazwa ASC


zapytanie nie jest sprawdzone...
ale ... powinno dzialac jesli nie wkradla sie jakas literowka smile.gif

pierwszy join dolacza do produktow id'eki minimalne zdjec dla poszczegolnych produktow a drugi dolacza do tych minimalnych reszte kolumn z tabeli zdjecia...
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-2024 Invision Power Services, Inc.