Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z dodatkowym joinem
Forum PHP.pl > Forum > Bazy danych > MySQL
agmakonts
Witam!

Mam problem z jednym zapytaniem.

Chcę pobierać z bazy informacje o artykułach i przy tym o ilości komentarzy i ocenie.

Gdy wyciągam tylko ilość komentarzy jest ok:

SELECT articles.id AS id, articles.title As title, users.username AS username, articles.pubish AS pubished, categories.name AS category, count( comments.text ) AS comments
FROM articles
JOIN users ON articles.author = users.id
LEFT JOIN categories ON articles.cat = categories.id
LEFT JOIN comments ON articles.id = comments.item_id
GROUP BY articles.id


i dane baza wypluwa takie jakie mają być czyli:



ale jak dodam jeszcze zapytanie o ocene (w tabeli z ocenami są kolumny id, item_id oraz rate przy czym rate to albo 1 albo -1). Zapytanie wygląda tak ale już jego wynik jest bardzo dziwny bo ani ilość komentarzy się nie zgadza ani ocena:

SELECT articles.id AS id, articles.title As title, users.username AS username, articles.pubish AS pubished, categories.name AS category, count( comments.id ) AS comments, sum( rank.rank ) AS rank
FROM articles
JOIN users ON articles.author = users.id
LEFT JOIN categories ON articles.cat = categories.id
LEFT JOIN comments ON articles.id = comments.item_id
LEFT JOIN rank ON articles.id = rank.item_id
GROUP BY articles.id




jak nie pytam o komentarze a tylko o ocene tez jest ok.

Proszę o pomoc w rozwiązaniu tego problemu bo już nie wiem jak to ugryźć.
blooregard
W count() i sum() msuisz ztosować podzapytania zliczające tylko wartości dla aktualnego wiersza (czyli indywidualnie dla każdego artykułu czy tam co tam masz).

Dla przykładu masz zapytanie z jednej z moich aplikacji (tam też miały się wybierać z bazy ilosć odsłon, ilośc ocen itp.):
  1. SELECT n.news_id , n.news_title, n.news_body, CONCAT(u.user_fname ,0x20, u.user_sname) AS user_name, n.news_queued, n.news_readed,
  2. GROUP_CONCAT(nc.category_name , 0x20) AS news_categories, n.news_verified, CONCAT(u2.user_fname ,0x20, u2.user_sname) AS user_name2,
  3. news_outer_author_name, (SELECT COUNT(com.comment_id) FROM comments AS com WHERE com.content_id = n.news_id AND com.content_type='n') AS comments_counter
  4. FROM news AS n
  5. LEFT JOIN news_to_category AS ntc ON ntc.news_id = n.news_id
  6. LEFT JOIN news_categories AS nc ON ntc.category_id = nc.category_id
  7. LEFT JOIN users AS u ON u.user_id = n.user_id
  8. LEFT JOIN users AS u2 ON u2.user_id = n.news_verified_by
  9. GROUP BY n.news_id
agmakonts
Dzięki, zaczęło działac lepiej ale nie do końca.

teraz zapytanie wygląda tak:

  1. SELECT articles.id AS id, articles.title AS title, users.username AS username, articles.pubish AS pubished, categories.name AS category, (
  2.  
  3. SELECT count( comments.id )
  4. FROM comments AS com
  5. WHERE com.item_id = articles.id
  6. ) AS comments, (
  7.  
  8. SELECT sum( rank.rank )
  9. FROM rank WHERE rank.item_id = articles.id
  10. ) AS rank
  11. FROM articles JOIN users ON articles.author = users.id
  12. LEFT JOIN categories ON articles.cat = categories.id
  13. LEFT JOIN comments ON articles.id = comments.item_id
  14. LEFT JOIN rank ON articles.id = rank.item_id AND 1 = rank.type
  15. GROUP BY articles.id
  16. LIMIT 0, 20



i ocena wyłazi dobrze ale liczba komentarzy tylko w pierwszym przypadku się zgadza a w 2 pozostałych jest podwojona, co dalej robię źle?
blooregard
No teraz to błędu już nie widzę sad.gif
agmakonts
Dzięki za pomoc, ten ostatni błąd był dziwny ale pomogło danie * zamiast coments.id w count komentarzy smile.gif
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.