为每个数组值选择一行

时间:2015-12-22 21:36:25

标签: php mysql sql

我想在我的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)

2 个答案:

答案 0 :(得分:3)

这是一个可能的查询,以获取最新投票的时间和每个帖子的投票数:

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 

答案 1 :(得分:1)

因此,您希望获得阵列中每个帖子的最新投票。我想你可以添加GROUP BY条款。

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