我在这个工作了一个小时。我尝试了几个不同的连接,子查询没有运气。情况就是这样。
两张桌子。一个具有主索引,一个具有来自用户的投票列表。我想确定一个特定用户为另一个用户留下的票数(简单)......然后确定总投票的百分比并按其分类(硬)。
表1包含列:post_id,poster_id 表2包含列:post_id,voter_id,vote
post_id在两个表之间相关。像这样的简单查询会得到一个输出,显示1个用户离开另一个用户的总票数...然后排序显示谁为另一个用户留下了最多的选票。
SELECT poster_id, voter_id, count(*) AS votes
FROM table_1, table_2
WHERE table_1.post_id = table_2.post_id
GROUP BY poster_id, voter_id
ORDER BY votes DESC
这很有效......但是我希望看到谁留下的投票率最高的是用户总票数的百分比。因此,我还需要获得“poster_id”所拥有的总票数,然后将当前数字除以百分比......然后进入该百分比。输出应该是这样的:
poster_id | voter_id | votes | vote_total | percent
----------------------------------------------------
1 | 3 | 10 | 10 | 100%
3 | 1 | 15 | 25 | 60%
2 | 1 | 3 | 6 | 50%
2 | 3 | 2 | 6 | 33%
3 | 2 | 5 | 25 | 20%
2 | 4 | 1 | 6 | 17%
等
基本上,选民#3负责100%海报#1的投票。海报#3获得了选民#1等60%的选票。
我们试图找出某个特定用户是否比其他用户更多地投票(按百分比)来尝试查找潜在的滥用行为。
我认为RIGHT JOIN会起作用,但它没有用完。
SELECT t1.poster_id, t1.voter_id, count(*) AS votes, count(t3.*) AS votes_total, votes / votes_total AS percentage
FROM (table_1 t1, table_2 t2)
RIGHT JOIN (table_1 t3, table_2 t4)
ON (t3.post_id = t4.post_id AND t3.poster_id = t1.poster_id)
WHERE t1.post_id = t2.post_id
GROUP BY t1.poster_id, t2.voter_id
ORDER BY percentage DESC
基本上永远运行,不会返回任何东西。我从内存中键入了该查询,并不完全代表真实的表名。正确方向上的任何点都会有所帮助。内联也许?
答案 0 :(得分:1)
试试这个:
SELECT
poster_id,
voter_id,
count(*) AS votes,
count(*) * 100 / total.total_votes as percentage
FROM table_1
join (
select poster_id, count(*) AS total_votes
FROM table_1
join table_2 on table_1.post_id = table_2.post_id
GROUP BY poster_id
) total on total.poster_id = table_1.poster_id
join table_2 on table_1.post_id = table_2.post_id
GROUP BY poster_id, voter_id
ORDER BY votes DESC
这使用子查询返回每个poster_id的总投票数,然后加入它,就好像它是一个表。
还要注意使用正确连接而不是通过where子句连接的更改。