0

私は似たような質問をたくさん見つけましたが、何もうまくいきませんでした。COUNT(DISTINCT visits.id)を使用すると、訪問数は正常に機能しますが、投票数は完全に間違っています。本来よりも 3 倍から 4 倍大きな値が表示されます。

これがクエリです

SELECT SUM(votes.rating), COUNT(visits.id)
FROM topics
LEFT JOIN visits ON ( visits.content_id = topics.id )
LEFT JOIN votes ON ( votes.content_id = topics.id )
WHERE topics.id='1'
GROUP BY topics.id

投票表はこんな感じ

id int(11) | rating tinyint(4) | content_id int(11) | uid int(11)

訪問テーブル

id int(11) | content_id int(11) | uid int(11)

トピックテーブル

id int(11) | name varchar(128) | message varchar(512) | uid int(11)

ヘルプ?

4

4 に答える 4

3

基本的に、返される可能性のある行の総数を合計またはカウントしています。したがって、各 ID に対して 3 回の訪問と 4 票があった場合、訪問数は 4 倍になり、投票数は 3 倍になります。

サブクエリを使用することで、あなたが望むことを最も簡単に達成できると思います:

SELECT (SELECT SUM(v.rating) FROM votes v WHERE v.content_id = t.id), 
       (SELECT COUNT(vi.id) FROM visits vi WHERE vi.content_id = t.id)
FROM topics t
WHERE t.id=1 
GROUP BY t.id
于 2012-07-18T16:21:39.183 に答える
0

データが表示されないとデバッグが少し難しくなりますが、それは投票数よりも訪問数の方が多いためだと思います。以下はあなたのために働くはずです:

SELECT (SELECT SUM (rating) FROM votes WHERE votes.content_id = topics.id), (SELECT COUNT (1) FROM visits WHERE visits.content_id = topics.id) FROM topics WHERE topics.id = 1

于 2012-07-18T16:23:16.970 に答える
0

問題はテーブル投票との結合にあると思われます。
投票に複数の行がある場合、その重複した行も使用してカウントされます。
個別を使用する場合、ID の重複をスキップします (投票による結合のため)。
最初の tiral として、一時的に結合を無効にして、何が起こるか見てみます。
それが役に立てば幸い

于 2012-07-18T16:20:37.330 に答える
0

これは、2 つの別個のサブクエリとして行う必要があります。

SELECT sumrating, numvisit
FROM (select visits.content_id, count(*) as numvisits
      from visits
      ) tvisit left outer join
     (select votes.content_id, SUM(votes.rating) as sumrating 
      from votes
      group by votes.content_id
     ) v
     ON ( v.content_id = tvisit.content_id )
WHERE tvisit.content_id='1'

結局のところ、トピック テーブルに参加する必要はまったくありません。

于 2012-07-18T16:25:31.600 に答える