Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Łączenie tabel
Forum PHP.pl > Forum > Przedszkole
patryczakowy
Witam mam problem z posortowaniem wyniku o tóż mam takie zapytanie

  1. SELECT c.cat_id AS cat_id,c.cat_name AS cat_name,COUNT(i.cat_id) AS ile,i.image_date AS ostatnie , i.image_thumb_file AS nazwa FROM 4images_categories c,4images_images i WHERE c.cat_parent_id =6 AND c.cat_id=i.cat_id AND i.image_active=1 GROUP BY i.cat_id, c.cat_order ORDER BY i.image_date DESC, c.cat_order ASC


c.cat_id|c.cat_name|ile | ostatnie | nazwa
58 | gr.23 | 60 |1165222205|jas.jpg
65 |mala |23 |9 1092066884|tadek.jpg

Zapytanie ma zliczyć ile jest zdjęć w każdej grupie i to działa bez zarzutu dodatkowo muszę posortować wedle c.cat_order i tu też niewiedze problemu ale problem pojawia się w momencie kiedy potrzebuje obrazu mieć datę ostatnio dodanego zdjęcia wtedy przestaje wo gule działać sortowanie
Gdzie jest błąd co żle robie z góry dziękuje za rady generalnie mogłem to wykonać w dwóch pentlach ale uparłem się że wyciągne to wszystko w jednym zapytaniu bo zakładam że się da

Doszłem narazie do czegoś takiego
  1. SELECT c.cat_id AS cat_id, c.cat_name AS cat_name, COUNT( i.cat_id ) AS ile, i.image_date AS ostatnie, i.image_thumb_file
  2. FROM 4images_categories c, 4images_images i
  3. WHERE c.cat_parent_id =6 AND c.cat_id = i.cat_id AND i.image_active =1 AND i.image_date = (
  4. SELECT max( image_date )
  5. FROM 4images_images WHERE i.cat_id = c.cat_id )
  6. GROUP BY i.cat_id, c.cat_order
  7. ORDER BY i.image_date DESC , c.cat_order ASC

Ale pobiera mi tylko jeden rekord ale już z dobrą datą jak to zmodyfikować żeby pobierał wszystkie rekordy??

Rozwiązanie okazała się banalnie proste może komuś się przyda
  1. SELECT c.cat_id AS cat_id, c.cat_name AS cat_name, COUNT( i.cat_id ) AS ile, min( i.image_date ) AS ostatnie, i.image_thumb_file
  2. FROM 4images_categories c, 4images_images i
  3. WHERE c.cat_parent_id =6 AND c.cat_id = i.cat_id AND i.image_active =1
  4. GROUP BY i.cat_id, c.cat_order
  5. ORDER BY c.cat_order ASC


Nie będe zakładać nowego wątku tylko się do tego dopiszę bo problem jest podobny teraz potrzebuje wybrać dane z trzech tabel dane obrazka nick użytkownika oraz liczbę komentarzy dla danego zdjęcia
  1. SELECT i.cat_id AS cat_id,i.image_name AS image_name, i.image_media_file AS image_media_file,i.image_thumb_file AS image_thumb_file, l.nick AS nick,COUNT(c.image_id) AS kom FROM (loginy l,4images_images i) LEFT JOIN 4images_comments AS c ON c.image_id=i.image_id WHERE i.image_active=1 AND i.cat_id=26 AND l.id=i.user_id ORDER BY i.image_date DESC


Wszystko działa poprawnie ale bez left joina jak go dołączam żeby zliczyć liczbę komentarzy to przestaje działać z góry dzięki za sugestię
wookieb
Try that
  1. SELECT i.cat_id AS cat_id,i.image_name AS image_name, i.image_media_file AS image_media_file,i.image_thumb_file AS image_thumb_file, l.nick AS nick, (SELECT count(image_id) FROM 4images_comments WHERE image_id=i.image_id) AS kom FROM (iponki_loginy l,4images_images i) WHERE i.image_active=1 AND i.cat_id=26 AND l.id=i.user_id ORDER BY i.image_date DESC

Chyba mi sie wydaje, że to jest nawet szybsze
patryczakowy
kurcze ale proste a ja byłem przekonany że podzapytania można używać tylko w WHERE i HAVING wielkie dzięki a tak apropo szybkości cały czas się zastanawiam co jest szybsze jedno złożone zapytanie w końcu tu są iloczyny kartezjanskie co przy dużych tabelach chyba takie szybkie nie będzie czy puszczenie w pętli dwóch prostych zapytań SELECT questionmark.gif
wookieb
Zalezy jakie zapytanie. Do tego to akurat wystarczylo w jednym. Po co 2 razy wlaczac mechanizm ktory zinterpretuje ci zapytanie itd. Wszystko masz w jednym, elegancko bez problemu.
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.