2013-05-22 37 views
1

items檢查用戶是否投票支持的最大項目數,他可以投票

id maxVotes parent  type 
10 2   9   heading 
11 0   10   item 
12 0   10   item 

votes

userId votedFor parent 
1  11  10 
1  12  10 
2  12  10 

我想檢查是否有物品存在,如果用戶已經投票支持該標題下允許的最大數量的項目。

在上面的示例中,表items包含項目。表votes包含用戶投的票。

itemstype : heading指定用戶可投票的最大件數col : maxVotes。在這種情況下,它是2

在表votesuser 1已投票的2個項目,並可以投票沒有更多的items是在該標題下。用戶2可以投1個項目。

它就這樣下去。

就我目前做的(使用PHP),就是:

select id, parent from items where id = 11 //The item exists.

select maxVotes from items where id = parent // This gives me the maximum items a user can vote for.

select count(votedFor) as votes from votes where userId = 1 // This'll give me 2.

User 1 can vote no more, but user 2 can vote once more -> Add his vote to the votes table

你能想到的更容易,效率更高除了我上面這樣做之外,採用複雜的方法來做到這一點?

我可以對事物進行修改,因爲這還沒有實現。或者,這是最好的方法嗎?

+0

諾曼你發佈的問題後逃脫? :) –

+0

我在這裏。在檢查網站之前,你不能告訴有人回覆。該網站不會立即向您發送每封回覆的電子郵件;-) – Norman

+0

從現在開始,您已經發布了32秒。我很快就回復你了。但你40分鐘後回覆。不要責怪這個網站。如果發佈任何答案或評論的意思。在您的收件箱(stackoverflow收件箱)中,您將收到通知。你不知道嗎? –

回答

2

您的設計沒問題,因爲它可以將一個查詢中的所有步驟組合在一起。

SELECT 
userId 
FROM votes 
# WHERE NOT EXISTS (SELECT 1 FROM votes sv WHERE sv.userId = votes.userId 
#     AND votedFor = 11) 
GROUP BY userId 
HAVING COUNT(*) < (
    SELECT 
    MAX(i2.maxVotes) 
    FROM 
    items i1 
    INNER JOIN items i2 ON i1.parent = i2.id 
    WHERE 
    i1.id = 11 /*Here you choose which item*/ 
) 

此查詢將爲您提供仍可投票的用戶。取消註釋WHERE NOT EXISTS部分以排除未達到投票數限制但已投票選中要檢查的項目的用戶。

看到它工作在sqlfiddle住。

UPDATE:

SELECT 
CASE WHEN numberOfVotes >= maxVotesForItem THEN 'Has reached vote limit' 
    ELSE CONCAT('User has ', maxVotesForItem - numberOfVotes, ' vote left') 
END AS result 
/*optionally include...*/ 
#, numberOfVotes, maxVotesForItem 
FROM (
    SELECT 
    COUNT(*) AS numberOfVotes 
    , (SELECT 
    MAX(i2.maxVotes) 
    FROM 
    items i1 
    INNER JOIN items i2 ON i1.parent = i2.id 
    WHERE 
    i1.id = 11 /*Here you choose which item*/ 
) AS maxVotesForItem 
    FROM 
    votes 
    WHERE 
    userId = 2 /*Here you choose which user*/ 
) sq 

再次sqlfiddle

+0

實際上,我的目標是檢查'特定'用戶(userId將由我提供)是否達到了他可以在該標題下投票的最大數量的項目,或者如果他沒有達到該數量。在這種情況下,他可以投票的最大數目是2.我需要檢查提供的用戶,例如:用戶1或用戶2.該用戶ID將來自查詢字符串。 – Norman

+0

因此,如果用戶1投票支持父項10下的2個項目,請檢查'votes'。 – Norman

+0

@Norman只需添加'WHERE userId = whateverID'?我沒有得到正確的問題嗎? – fancyPants

0

你可以通過添加一個多場voteCount所以更改表結構和存儲voteFor在如下JSON結構,

Table: UserVote 

userId voteCount voteFor 
1  2   {11,12} 
2  1   {11} 

而投票,你可以插入此表本身的計數,並檢查計票從這裏開始。

(OR)

與2代表作爲voteCount沿再添加一個表有隻計算

Table: VoteCount 

userId voteCount 
1  2   
2  1   


Table items 

id maxVotes parent  type 
10 2   9   heading 
11 0   10   item 
12 0   10   item 

Table votes 

userId votedFor 
1  11 
1  12 
2  12 

首先方法是有效的之一,它減少一個表。易於更新也。從DB中檢索json數據將其解碼。爲該陣列添加一個ID。編碼並更新它。就這樣。

+0

但是,這將很難更新... – Norman

+0

這取決於你的最大數量。因爲投票你不會允許超過5票maxi。或者您必須創建一個voteCount作爲新表。並且讓你的舊桌子保持原樣。在新表中,您只能擁有userID和voteCount。檢查我編輯的答案。 –

+0

第一種方法很簡單,它減少了一個表格。易於更新也。從DB中檢索json數據將其解碼。爲該陣列添加一個ID。編碼並更新它。就這樣。 –