0

次のクエリがあります。

SELECT a.link_field1 AS journo, count(a.link_id) as articles, AVG( b.vote_value ) AS score FROM dan_links a LEFT JOIN dan_votes b ON link_id = vote_link_id WHERE link_field1 <> '' and link_status NOT IN ('discard', 'spam', 'page') GROUP BY link_field1 ORDER BY link_field1, link_id

このクエリは、リストの最初のアイテムに対して3のカウントを返します。返されるものは

Journo | count | score
John S | 2 | 6.00
Joe B | 1 | 4

ただし、最初のJohn Sの場​​合は、3のカウントを返します。

直接問い合わせたら

select * from dan_links where link_field1 = 'John S' 

期待どおりに2つのレコードが返されます。なんらかの理由でdan_voteテーブルのレコードをカウントしていない限り、カウントが間違っている理由を一生理解することはできません。

どうすれば正しいカウントを取得できますか、またはクエリが完全に間違っていますか?

編集:表の内容

dan_links

link_id | link_field1 | link | source | link_status
1 | John S | http://test.com | test.com | approved
2 | John S | http://google.com | google | approved
3 | Joe B | http://facebook.com | facebook | approved

dan_votes

vote_id | link_id | vote_value
1 | 1 | 5
2 | 1 | 8
3 | 2 | 4
4 | 3 | 1

編集:何らかの理由で投票テーブルの行をカウントしているようです

4

1 に答える 1

0

一致するレコードごとに1行が作成される条件link_id = vote_link_idで左外部結合を実行している場合、次のようなものがあります

link_id | link_field1 | link | source | link_status|vote_id|vote_value
1 | John S | http://test.com | test.com | approved|1|5
1 | John S | http://test.com | test.com | approved|2|8
2 | John S | http://google.com | google | approved|3|4
3 | Joe B | http://facebook.com | facebook | approved|4|1

link_field1 でグループ化すると、John S のカウントは 3 になります

ネストされたクエリが機能する可能性があります

SELECT journo,count(linkid) as articles,AVG(score) FROM
(SELECT a.link_field1 AS journo, AVG( b.vote_value ) AS score, a.link_id as linkid 
FROM dan_links a 
LEFT JOIN dan_votes b 
ON link_id = vote_link_id 
WHERE link_field1 <> '' 
and link_status NOT IN ('discard', 'spam', 'page') 
GROUP BY link_id 
ORDER BY link_field1, link_id) GROUP BY journo

上記のクエリは、((n1+n2)/2+n3)/2 != (n1+n2+n3)/3として誤った平均を与えるため、以下のクエリを使用します

SELECT journo,count(linkid) as articles, SUM(vote_sum)/SUM(count(linkid)) 
FROM
    (SELECT a.link_field1 AS journo, SUM( b.vote_value ) AS vote_sum, a.link_id as linkid, count(a.link_id) as count_on_id
    FROM dan_links a 
    LEFT JOIN dan_votes b 
    ON link_id = vote_link_id 
    WHERE link_field1 <> '' 
    and link_status NOT IN ('discard', 'spam', 'page') 
    GROUP BY link_id 
ORDER BY link_field1, link_id) GROUP BY journo

お役に立てれば。

于 2012-06-05T03:02:10.037 に答える