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