Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Niewytłumaczone zjawisko z ZAPYTANIEM ?
luckyluc
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.04.2006

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


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

Ten post edytował luckyluc 8.02.2008, 13:37:05
Go to the top of the page
+Quote Post
specialplan
post
Post #2





Grupa: Zarejestrowani
Postów: 206
Pomógł: 21
Dołączył: 1.09.2006
Skąd: Edinburgh

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


produkty_pozycja?

Nie widze tego w strukturze bazy, ktora podajesz.
Go to the top of the page
+Quote Post
luckyluc
post
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.04.2006

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


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

Ten post edytował luckyluc 8.02.2008, 13:36:47
Go to the top of the page
+Quote Post
specialplan
post
Post #4





Grupa: Zarejestrowani
Postów: 206
Pomógł: 21
Dołączył: 1.09.2006
Skąd: Edinburgh

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


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.

Ten post edytował specialplan 8.02.2008, 13:44:11
Go to the top of the page
+Quote Post
luckyluc
post
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.04.2006

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


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");


Ten post edytował luckyluc 8.02.2008, 20:08:14
Go to the top of the page
+Quote Post
wicy
post
Post #6





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 2.02.2008

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


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





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.04.2006

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


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");


Ten post edytował luckyluc 10.02.2008, 01:53:52
Go to the top of the page
+Quote Post
heaven
post
Post #8





Grupa: Nieautoryzowani
Postów: 92
Pomógł: 15
Dołączył: 21.10.2006

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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...

Ten post edytował heaven 10.02.2008, 18:23:53
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 19:00