我有下表:
+-----------------+
| id| user | vote |
+-----------------+
| 1 | 1 | text |
| 2 | 1 | text2|
| 3 | 2 | text |
| 4 | 3 | text3|
| 5 | 2 | text |
+-----------------+
我想做的是计算“投票”
SELECT COUNT(vote), vote FROM table GROUP BY vote
工作正常。输出:
+-------------------+
| count(vote)| vote |
+-------------------+
| 3 | text |
| 1 | text2|
| 1 | text3|
+-------------------+
但现在我只想计算用户的第一次或第一次和第二次投票。 所以我想要的结果是(如果我只算第一次投票):
+-------------------+
| count(vote)| vote |
+-------------------+
| 2 | text |
| 1 | text3|
+-------------------+
我尝试使用count(不同的......),但可以使它工作。
任何正确方向的暗示?
答案 0 :(得分:1)
您可以在单个SQL语句中执行此操作,如下所示:
SELECT vote, COUNT(vote)
FROM
(
SELECT MAX(user), vote
FROM table1
GROUP BY user
) d
GROUP BY vote
请注意,这只会给你1票而不是1或2。
答案 1 :(得分:1)
最简单的方法是使用其中一个"行编号"在this SO问题中列出的解决方案。然后您的原始查询几乎就在那里:
SELECT
COUNT(vote),
vote
FROM tableWithRowNumberAdded
WHERE MadeUpRowNumber IN (1,2)
GROUP BY vote
我的选择是啰嗦更长,并要求工作台。这些可以是真实的"架构中的表,或者您熟悉的任何中间结果集的风格。
首先为每位用户进行第一次投票:
SELECT user, min(id) FROM table GROUP BY user
把它放在工作台上;我们称之为FirstVote。接下来,我们可以获得每个用户的第二次投票,如果有的话:
SELECT user, min(id) FROM table WHERE id not in (select id from FirstVote) GROUP BY user
让我们调用这个SecondVote的结果。 UNION FirstVote到SecondVote,通过vote
将其连接到原始表和组。有你的答案!
SELECT
vote,
COUNT(*)
FROM table
INNER JOIN
(
SELECT id FROM FirstVote
UNION ALL
SELECT id FROM SecondVote
) as BothVotes
ON BothVotes.id = table.id
GROUP BY vote
当然,它可以被构造为具有多个子查询的单个语句,但是在本论坛中维护或阅读将是可怕的。
答案 2 :(得分:0)
这对MySQL来说是一个非常棘手的问题。在其他系统上有窗口函数:它在一组表行中执行计算,这些表行以某种方式与当前行相关。 MySQL缺乏此功能。所以应该寻找一种解决方法。以下是问题描述和建议的耦合解决方案:MySQL and window functions。
我还假设first 2 votes by the User
可以由Id确定:之前的投票有较小的Id。
基于此,我建议您解决问题:
SELECT
Vote,
Count (*)
FROM
Table,
(
SELECT
user_id, SUBSTRING_INDEX(GROUP_CONCAT(Id ORDER BY user_id ASC), ',', 2) AS top_IDs_per_user
FROM
Table
GROUP BY
user_id
) s_top_IDs_per_User
WHERE
Table.user_id = s_top_IDs_per_User.User_id and
FIND_IN_SET(Id, s_top_IDs_per_User.top_IDs_per_user)
GROUP BY Vote
;