2015-12-22 119 views
1

我想在我的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,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操作符允许我选择数组中包含的每个帖子上的投票数,并在最近的帖子被投票时排序?在上表中,因为有2票对1后,并在后2投1中,结果将是

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

有'DISTINCT postid',这将使你只有一个ID后面,而不是'1,2,1',你会得到' 1,2'。我相信这个命令也会保留下来。 –

+0

东西sort've是这样的:'SELECT DISTINCT id,COUNT(*)AS num_votes FROM votes ORDER BY id,\'time \'DESC GROUP BY id' –

+0

那么group by postid如同说@trincot? –

回答

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 
+0

谢谢!这里的查询我最终使用了'SELECT postid,sum(case when votetype ='2'then 1 else 0 end)up_count,sum(case when votetype ='1'then 1 else 0 end)down_count FROM votes WHERE postid IN $ posts)GROUP BY postid ORDER BY MAX(time)DESC',它选择每个帖子上下投票的数量而不是总数 – Jojodmo

1

所以,你想获得阵列中的每个职位最新的投票。我想你可以添加一个GROUP BY条款。

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

哦,是的,忘了。 – dan08