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