Zapytanie RANKINGowe - 2 tabele

Odpowiedz Nowy wątek
2011-10-23 17:26
0

Witam. Mam następujący problem.
Posiadam tabelę z artykułami. Chciałbym zrobić ranking najczęściej komentowanych artykułów. Komentarze znajdują się w osobnej tabeli, a każdy komentarz ma zapisany ID_ARTYKULU, do którego się odnosi.

Przeszukałem Google, kombinowałem sam dość długo i chociaż kompletnym laikiem nie jestem to nic nie udało mi się wymyślić. Poniżej zamieszczam najbardziej udaną z moich prób, która i tak nie spełnia zamierzonego zadania, a nawet nie działa:


SELECT * FROM artykuly 
          WHERE
                   (id IN (SELECT id_artykulu FROM komentarze GROUP BY id_artykulu ORDER BY COUNT(id_artykulu) DESC))

Za wszelką pomoc dziękuje.

Pozdrawiam!

Pozostało 580 znaków

2011-10-23 17:50
0
select
  a.id,
  count(k.id_artykulu) ile
from
  artykuly a
left join komentarze k on a.id = k.id_artykulu
group by
  a.id
order by
  2 desc

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-23 18:25
0

Bardzo dziękuję za szybką i w dodatku dobrą odpowiedz.
Jakby ktos nie wiedzial o co chodzi, to pokazuje dla osob, ktore beda mialy podobny problem, dokladnie jak trzeba zrobic:


SELECT *, COUNT(komentarze.id_artykulu) AS ile 
          FROM artykuly 
                             LEFT JOIN komentarze ON artykuly.id = komentarze.id_artykulu 
                                           GROUP BY artykuly.id ORDER BY ile DESC

Zapytanie pobiera wszystkie informacje o artykułach z tabeli artykuly, laczy tabele artykuly z tabela komentarze za pomoca ID z tabeli artykuly, poniewaz tabela komentarze posiada ID_ARTYKULU, do ktorego sie odnosi. Po "polaczeniu" tych dwoch tabel zapytanie przy pomocy GROUP BY grupuje wyniki wedlug ID z tabeli z artykulami i sortuje malejaco wedlug ilosci komentarzy pod danym artykulem.

Mam tylko jeden problem z tym zapytaniem. Nie spodziewalem sie ze tak bedzie ono wygladac i chociaz dziala to nie potrafie dodac do niego warunku WHERE. Otoz chcialbym zeby wyswietlalo artykuly tylko z ostatniego dnia oraz tylko te, ktore maja przynajmniej jeden komentarz. Po dodaniu warunku WHERE w ten sposob dostaje blad:


SELECT *, COUNT(komentarze.id_artykulu) AS ile 
          FROM artykuly 
                 WHERE (czas_dodania_timestamp > 1319299974)
                             LEFT JOIN komentarze ON artykuly.id = komentarze.id_artykulu 
                                           GROUP BY artykuly.id ORDER BY ile DESC

A oto błąd:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN komentarze ON artykuly.id = komentarze.id_artykulu GROUP BY artykuly.id ORDER' at line 1

Bede wdzieczny za ponowna pomoc.
Pozdrawiam!

Pozostało 580 znaków

2011-10-23 18:43
0

Udalo mi sie znalezc odpowiedz na moje pytania. A oto ostateczne rozwiazanie problemu:


SELECT *, COUNT(komentarze.id_artykulu) AS ile 
          FROM artykuly 
                             LEFT JOIN komentarze ON artykuly.id = komentarze.id_artykulu 
                                            WHERE (artykuly.czas_dodania_timestamp > AKTUALNY CZAS - 24*3600)
                                                       GROUP BY artykuly.id HAVING ile > 0 ORDER BY ile DESC

Pozostało 580 znaków

2011-10-23 18:55
0

zamień left join na inner join i wywal having. PODSTAWY!!!!!


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-25 19:47
0

dzięki za sugestię już przerabiam swoje :)


Ludzie uważają, że czas jest ważny, ponieważ sami go wymyślili.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0