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包含用户投票。

items type : heading指定用户可以投票的最大项目数col : maxVotes。在这种情况下,它是2.

在表中votes user 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

除了我上面的方法之外,你能想出一种更简单、更有效和更复杂的方法吗?

我可以对事情进行更改,因为这仍然没有实现。或者,这是最好的方法吗?

4

2 回答 2

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中工作。

更新:

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

于 2013-05-22T11:48:29.593 回答
0

您可以通过再添加一个字段 voteCount 来更改表结构,并将 voteFor 存储在 json 结构中,如下所示,

Table: UserVote

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

因此,在投票时,您可以将计数插入此表本身并从此处检查投票计数。

(或者)

再加一张桌子和你的 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。编码并更新它。就这样。

于 2013-05-22T11:28:18.643 回答