Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie podające liczbę wystąpień klucza obcego w innej tabeli
Ziels
post
Post #1





Grupa: Zarejestrowani
Postów: 235
Pomógł: 2
Dołączył: 30.06.2006

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


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ł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
Sedziwoj
post
Post #2





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


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.
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: 22.08.2025 - 22:36