2011-02-24 54 views
4

使用数据库结构我没有创建并希望获得对简单MySQL查询的一些帮助。我有一个表决表votes这些领域:MySQL投票表,查找每个用户对一个条目的最新投票,并根据值进行计数

vote_id =唯一投票标识符

条目的item_id = ID表决

voter_id =谁进入投票成员的ID

vote_date =投票日期

vote =投票类型(1或2)

每个用户可以在item_id指定的网站条目上投票多次。他们可以投一票,这是一个“喜欢”的投票,或者投票是一个“不同”的投票。每次投票时,都会创建一条新记录。我希望能够为特定的item_id上的每个用户找到最新的vote值,然后能够实际SUM或COUNT投票列如果投票值是“like”(值为1)

例如

vote_id item_id voter_id vote_date  vote 
60  9   27   1273770151 1 
153  9   45   1274896188 1 
163  9   3   1274918584 1 
164  9   3   1275021495 2 
1051  9   181  1290839090 1 

我想每个用户的最新vote值,然后做如何的1个多票还有一个计数。在这种情况下,#会3

27 = 1 
45 = 1 
3 = 2 
181 = 1 
     3 

理想的情况下,一旦我为每个item_id一个“分数”,查询将能够每个人的得分总值到所有当前的总#“喜欢”在网站上。

感谢您的任何帮助。我尽了最大努力通过搜索寻找答案,但没有什么是完全正确的。

非常感谢。

回答

1

[编辑:]我的附加价值(1052,10,3,1290839091,1)更好地行使的问题,不得不 “ITEM_ID” 添加到子查询提取最新票。


耶!最后一个stackoverflow问题,我可以真正回答!我一直在浏览一周,寻找短暂的&甜美的&走上我的小巷。感谢一个有趣的SQL问题!

首先,您需要提取最新票。 (voter_id,item_id,vote_date)的组合更适合这种工作方式!

SELECT 
    voter_id, item_id, MAX(vote_date) AS vote_date 
FROM 
    votes 
GROUP BY 
    voter_id, item_id 

结果:

+----------+---------+------------+ 
| voter_id | item_id | vote_date | 
+----------+---------+------------+ 
|  3 |  9 | 1275021495 | 
|  3 |  10 | 1290839091 | 
|  27 |  9 | 1273770151 | 
|  45 |  9 | 1274896188 | 
|  181 |  9 | 1290839090 | 
+----------+---------+------------+ 

然后你需要加入原始表对这些结果。一个子选择将完成这项工作。请注意复制&如何上面的查询粘贴到下面的加盟,但现在它定名为“TMP”:

SELECT 
    v.* 
FROM (
    SELECT 
    voter_id, item_id, MAX(vote_date) AS vote_date 
    FROM 
    votes 
    GROUP BY 
    voter_id, item_id 
) tmp 
INNER JOIN 
    votes v ON ( v.vote_date = tmp.vote_date 
       AND v.voter_id = tmp.voter_id 
       AND v.item_id = tmp.item_id 
) 

结果:

+---------+---------+----------+------------+------+ 
| vote_id | item_id | voter_id | vote_date | vote | 
+---------+---------+----------+------------+------+ 
|  60 |  9 |  27 | 1273770151 | 1 | 
|  153 |  9 |  45 | 1274896188 | 1 | 
|  164 |  9 |  3 | 1275021495 | 2 | 
| 1051 |  9 |  181 | 1290839090 | 1 | 
| 1052 |  10 |  3 | 1290839091 | 1 | 
+---------+---------+----------+------------+------+ 

我相信你知道怎么从这里做。 ......啊,妈的,我不能帮助我自己,这是太可爱了:

SELECT 
    v.item_id, SUM(2 - v.vote) AS likes, SUM(v.vote - 1) AS dislikes 
FROM (
    SELECT 
    voter_id, item_id, MAX(vote_date) AS vote_date 
    FROM 
    votes 
    GROUP BY 
    voter_id, item_id 
) tmp 
INNER JOIN 
    votes v ON ( v.vote_date = tmp.vote_date 
       AND v.voter_id = tmp.voter_id 
       AND v.item_id = tmp.item_id 
) 
GROUP BY 
    v.item_id 

结果:

+---------+-------+----------+ 
| item_id | likes | dislikes | 
+---------+-------+----------+ 
|  9 |  3 |  1 | 
|  10 |  1 |  0 | 
+---------+-------+----------+ 
+0

谢谢朱利叶斯。这确实是很有意义的,并且感谢你写出这样的细节,唯一的问题是,我无法让它工作:)此代码似乎找到了每个用户对所有item_ids的单次最新投票。目前有127个不同的选民在4900个参赛作品中有12000张选票,这个查询只返回127个结果,而不是每个4900的得分。这是否有意义?希望我的原始问题很明确。你的最后一个“结果”框是我所追求的,但是每一个条目都有一行,并且能够总结喜欢的......感谢你。 – noahkuhn 2011-02-24 05:09:00

+0

哎呀,是的,我犯了一个小错误。我编辑了答案。现在应该工作! – 2011-02-24 07:10:49

+0

这是巧妙的朱利叶斯,非常感谢你的帮助。唯一的最后一个好处就是能够对喜欢的列进行总结,但是我希望可以将其排除...... – noahkuhn 2011-02-24 15:48:49

0

不确定的问题,这是你在找什么?

SELECT COUNT(*) FROM votes WHERE vote = '1' AND item_id = '9'

+0

不是,我只想为每个voter_id投票_newest_。用户可能已经投了1票,然后2票投了票。我不想在伯爵考虑那个投票。还有_many_ item_ids,因此此查询需要为每个item_id找到“分数”。我希望能够总结所有分数的总值,因此COUNT的总和。 – noahkuhn 2011-02-24 00:23:02