只计算一次或两次MySQL表中的投票

时间:2014-04-22 09:11:55

标签: mysql

我有下表:

+-----------------+  
| 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(不同的......),但可以使它工作。

任何正确方向的暗示?

3 个答案:

答案 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
;