Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie podające liczbę wystąpień klucza obcego w innej tabeli
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
Ziels
Witam

Mam następujący problem - mam dwie tabele, ratings oraz articles. Potrzebuję jakimś zapytaniem wyciągnąć z tabeli articles dane dot. artykułu, dołożyć do tego kolumnę zawierającą liczbę użytkowników którzy oceniło dany artykuł, oraz posortować wg. niej. Przykładowe dane:

Kod
Articles
------
| id |
------
| 1  |

Ratings
-------------------------------------------------------
| id | type | article_id | user_id | value |
-------------------------------------------------------
| 1  |   1   |     1        |      1     |    5    |
| 2  |   2   |     1        |      1     |    8    |
| 3  |   1   |     1        |      2     |    7    |
| 4  |   2   |     1        |      2     |    9    |
| 5  |   1   |     1        |      3     |    4    |
| 6  |   2   |     1        |      3     |    2    |


Chciałbym żeby zapytanie zwróciło mi coś takiego:


Kod
Articles
-----------------------------
| id | ratings_count |
-----------------------------
| 1  |         3          |


Dlaczego 3? Trzech użytkowników oceniło artykuł wg różnych kryteriów (kolumna type). Do tej pory wykombinowałem takie zapytanie:

  1. SELECT article.*, count(*) AS ratings_count FROM article LEFT JOIN rating ON (article_id=article.id) GROUP BY article.id, ORDER BY ratings_count DESC;


Niestety zwraca mi to jedynie ile jest wpisów dotyczących danego artykułu, w tym wypadku będzie to 6, nie 3. Dodatkowo przy występowaniu innych kolumn w tabeli Articles musiałbym je dołożyć do Group By co wydajności raczej nie poprawi. Ktoś ma jakiś pomysł?
Sedziwoj
Po pierwsze oduczyć się tych głupot z MySQL, jak się grupuje, to się grupuje.
  1. SELECT
  2. a.*,
  3. CASE
  4. WHEN art_vote.votes IS NULL
  5. THEN 0
  6. ELSE art_vote.votes
  7. END AS ratings_count
  8. FROM Articles AS a
  9. LEFT JOIN ( SELECT article_id,
  10. count(*) AS votes
  11. FROM ( SELECT
  12. article_id
  13. FROM Ratings GROUP BY
  14. user_id,
  15. article_id
  16. ) AS vote
  17. GROUP BY
  18. article_id
  19. ) art_vote ON a.id = art_vote.article_id


Nie mówię, że to jest najlepsze, ale działa.
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.