2011-02-24 63 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