【问题标题】:MySQL vote history for user with total vote count for each item用户的 MySQL 投票历史记录以及每个项目的总投票数
【发布时间】:2015-09-29 17:30:39
【问题描述】:

我有类似这些的表格:

names (these are being voted on)
+----+-------+
| ID | name  |
+----+-------+
|  1 | name1 |
|  2 | name2 |
|  3 | name3 |
|  4 | name4 | 
+----+-------+

votes
+----+----------+------+---------+
| ID | voter_id | time | name_id |
+----+----------+------+---------+
|  1 |     1    |   x  |    1    |
|  2 |     2    |   x  |    1    |
|  3 |     3    |   x  |    2    |
|  4 |     4    |   x  |    2    |
|  5 |     5    |   x  |    4    |
+----+----------+------+---------+

expected result for voter_id 1
| n.ID | n.name | v.time | votecount|
+------+--------+--------+----------+
|   1  |  name1 |   x    |      2   |
+------+--------+--------+----------+

我正在使用的查询:

SELECT COUNT(DISTINCT v.VOTE_ID) VOTECOUNT, v.VOTE_TIME, v.VOTER_ID, n.ID, n.NAME
FROM `votes` as v
LEFT JOIN `names` as n
ON n.ID = v.NAME_ID
WHERE v.VOTER_ID = :id
GROUP BY n.ID
ORDER BY v.TIME DESC

备用查询:

SELECT COUNT(DISTINCT v.VOTE_ID) VOTECOUNT, v.VOTE_TIME, v.VOTER_ID, n.ID, n.NAME
FROM `votes` as v
LEFT JOIN `names` as n
ON n.ID = v.NAME_ID
GROUP BY n.ID
HAVING v.VOTER_ID = :id
ORDER BY v.TIME DESC

我正在尝试获取用户投票的项目列表,并计算每个项目总共获得了多少票。

如果我使用 WHERE 子句,投票数显然总是 1,但它会获取用户投票的所有项目。
我已经尝试使用 HAVING voter_id 来保持投票总数和那种工作,但是由于某种原因,用户投票的一些项目被省略了。将 LEFT JOIN 更改为 RIGHT JOIN 会给出一个稍微不同的列表,但永远不会完整。 会有更好的方法吗?

【问题讨论】:

  • 您说您需要“获取用户投票的项目列表,并计算每个项目获得的总票数”...。哪一列表示一个项目? name_ID?如果是这样,如果您在第一个查询中将其添加到 group by 会发生什么? group by 语句的 mysql 扩展可能隐藏了您的问题。另外为您提供的数据示例提供预期结果,以帮助阐明您的愿望。
  • 下次尝试提供SqlFiddle,以便我们更好地理解问题并更快地给您答案 – 另请阅读How to askHow to create a Minimal, Complete, and Verifiable example.

标签: mysql sql join


【解决方案1】:

两件事。

首先,尝试将第二个查询中的HAVING 子句替换为HAVING MAX(CASE WHEN v.VOTER_ID = :id THEN 1 ELSE 0 END) = 1

其次,您的选择列表与您的分组不匹配,所以我不确定您要在那里做什么。时间列到底是什么?我对你想要的东西的尝试看起来像:

SELECT COUNT(DISTINCT v.VOTE_ID) VOTECOUNT, n.ID, n.NAME
FROM `votes` as v
LEFT JOIN `names` as n
ON n.ID = v.NAME_ID
GROUP BY n.ID, n.NAME
HAVING MAX(CASE WHEN v.VOTER_ID = :id THEN 1 ELSE 0 END) = 1

【讨论】:

  • 时间将是投票的时间戳。我不确定 group by 出了什么问题,但我想我正在选择我真的不需要的列。该 HAVING 子句似乎可以使其完美运行,而无需更改任何其他内容。谢谢你,我自己永远也想不通!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多