0

結合されているテーブルが3つあります。私はほとんど解決策を持っていますが、ここで起こっている小さな問題が1つあるようです。ステートメントは次のとおりです。

SELECT items.item,
COUNT(ratings.item_id) AS total,
COUNT(comments.item_id) AS comments,
AVG(ratings.rating) AS rate
FROM `items`
LEFT JOIN ratings ON (ratings.item_id = items.items_id)
LEFT JOIN comments ON (comments.item_id = items.items_id)
WHERE items.cat_id = '{$cat_id}'  AND items.spam < 5
GROUP BY items_id ORDER BY TRIM(LEADING 'The ' FROM items.item) ASC;");

itemsというテーブルがあり、各アイテムにはitems_idというIDがあります(複数形であることに注意してください)。各アイテムの個々のユーザーコメントの表と、各アイテムの評価の表があります。(最後の2つには、「item_id」という対応する列があります)。

コメントと評価の合計(アイテムごと)を別々にカウントしたいだけです。私のSQLステートメントが上にあるように、それらは合計です。

  • 合計は評価の合計であることに注意してください。それは私が修正する必要がある悪い命名スキームです!

更新:「total」は問題なくカウントされるようですが、「comments」テーブルにコメントを追加すると、COUNT関数は「comments」と「total」の両方に影響し、結合された出力と等しくなるようです。

4

2 に答える 2

1

問題は、結合された3つのテーブルすべての結果をカウントしていることです。試す:

SELECT i.item,
r.ratetotal AS total,
c.commtotal AS comments,
r.rateav AS rate
FROM items AS i
LEFT JOIN
    (SELECT item_id, 
    COUNT(item_id) AS ratetotal, 
    AVG(rating) AS rateav 
    FROM ratings GROUP BY item_id) AS r 
ON r.item_id = i.items_id
LEFT JOIN
    (SELECT item_id, 
    COUNT(item_id) AS commtotal 
    FROM comments GROUP BY item_id) AS c
ON c.item_id = i.items_id
WHERE i.cat_id = '{$cat_id}'  AND i.spam < 5
ORDER BY TRIM(LEADING 'The ' FROM i.item) ASC;");

このクエリでは、サブクエリに適切にカウントを行わせ、その値をメインクエリに送信して、結果をフィルタリングします。

于 2012-08-15T18:19:04.170 に答える
0

これはカーディナリティの問題だと思います。試すCOUNT(distinct comments.item_id)

于 2012-08-15T18:19:30.083 に答える