为每个数组值选择一行


Select one row for each array value

我想在我的MySQL数据库中为数组中的每个值获取一行。我想做的是获取最近投票的帖子。votes表具有以下结构

| id | postid | voter | vote type |    time    |
|====|========|=======|===========|============|
| 1  |   1    |   1   |     1     | 1445389824 |
| 2  |   2    |   6   |     1     | 1445408529 |  
| 3  |   1    |   5   |     2     | 1445435978 |

我想按照投票顺序选择最近投票的帖子。因此,例如,由于按时间从最大到最低排序的投票 ID 是 3、2、1,因此我想选择帖子 ID 1、2、1但是,因为 1 出现了两次,我只想选择第一个,所以最终结果将是 1、2

这个表将非常非常大,因此选择每个帖子 ID 然后使用 php 将其修剪为所需的数组似乎不是一个好主意。

此外,只应选择数组中的帖子。例如,选择所有帖子而不省略重复项将是

SELECT `postid`
FROM `votes`
WHERE `postid` IN ($posts)
ORDER BY `time` DESC

但是通过使用这种方法,我将不得不使用 php 摆脱重复的条目,这似乎非常密集。

我还想选择名单中每个职位的票。我可以在单独的查询中执行此操作,但是在一个查询中执行此操作可能会更快。所以,例如

SELECT COUNT(`id`)
FROM `votes`
WHERE `postid` IN ($posts)
ORDER BY `time` DESC

将选择给定职位的所有投票。相反,我希望它为每个帖子选择一个投票数组,或者可以转换为该投票的内容。

是否有任何MySQL运算符允许我选择数组中包含的每个帖子的投票数,并按最新帖子投票时对它们进行排序?在上表中,因为帖子 1 有 2 票,帖子 2 有 1 票,结果将是

array("1" => 2, "2" => 1)

下面是一个可能的查询,用于获取最新投票的时间和每个帖子的投票计数:

SELECT   `postid`, 
          MAX(time) as time,
          COUNT(*) as vote_count
FROM     `votes`
WHERE    `postid` IN ($posts)
GROUP BY `postid`
ORDER BY 2 DESC

如果您想要这些最新votes记录的所有其他字段,则可以将上述字段用作较大记录的子查询:

SELECT     `id`, `postid`, `voter`, 
           `vote_type`, `time`, vote_count
FROM       `votes` v
INNER JOIN (
            SELECT   `postid`, 
                      MAX(time) as time,
                      COUNT(*) as vote_count
            FROM     `votes`
            WHERE    `postid` IN ($posts)
            GROUP BY `postid`) filter
        ON  v.`postid` = filter.`postid`
        AND v.`time` = filter.time 
ORDER BY `time` DESC 

所以你想为数组中的每个帖子获得最新的投票。我认为您可以添加一个 GROUP BY 子句。

SELECT `postid`, COUNT(postid) AS votecount
FROM `votes`
WHERE `postid` IN ($posts)
GROUP BY `postid`
ORDER BY MAX(`time`)