【发布时间】: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 ask和How to create a Minimal, Complete, and Verifiable example.