我正在尝试从表格中最近20个条目的列表中选择5个查看次数最多的文章。我的表结构基本上是这样的:
id | date | title | content | views
我的第一个想法是使用内部选择来获取最近的20篇文章,然后从中选择,但我还没有运气。
//doesn't work (my version of mysql doesn't support LIMIT in sub queries)
$recent = "(SELECT id FROM news ORDER BY date DESC LIMIT 20)";
$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN $recent ORDER BY views DESC LIMIT ".self::RECENT_MAX);
//neither does this (syntax error @ 'OFFSET 20')
$recent = "(SELECT MAX(date) FROM news ORDER BY date DESC OFFSET 20)";
$result = $db->query("SELECT id, title, date, content FROM news WHERE date > $recent ORDER BY views DESC LIMIT ".self::RECENT_MAX);
任何人都对如何构建此查询有任何建议?
答案 0 :(得分:6)
我刚试过这个并且它可以正常工作
SELECT *
FROM (
SELECT *
FROM news
ORDER BY id DESC
LIMIT 0, 20
) lasttwenty
ORDER BY views DESC
LIMIT 0, 5
服务器版本:5.0.51a-3ubuntu5.4
答案 1 :(得分:1)
如果你在通过SQL工作时遇到很多问题,我建议你从数据库中抓取最近的20篇文章,然后用PHP处理它,找到5个最常见的文章。您可以循环遍历行,也可以将它们全部加载到数组中并对其进行排序。
答案 2 :(得分:0)
为什么不单独运行第一个(内部)查询,并以编程方式创建第二个查询?
$ids = array();
$result = $db->query("SELECT id FROM news ORDER BY date DESC LIMIT 20");
while ($row = $result->fetch()) {
$ids[] = $row[0];
}
$ids = implode(',', $ids);
$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN ($ids) ORDER BY views DESC LIMIT ".self::RECENT_MAX);
或者这种性质......
更新:或者您只需获取按date
排序的前20个,然后在PHP中按views
对thr结果数组进行排序,最后取5个最顶端的项目(我想这就是SilentGhost在评论中的意思)。
答案 3 :(得分:0)
由于我在单个查询中无法想到任何方法,我建议选择代码中的前5位,或者使用两个查询来执行此操作,例如:
$items = $db->query("SELECT id FROM news ORDER BY date DESC LIMIT 20");
$recent = array();
foreach ($items->fetchAll() as $item) { $recent[] = $item['id']; }
$recent = "('".join("','", $recent)."')";
$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN {$recent} ORDER BY views DESC LIMIT ".self::RECENT_MAX);
答案 4 :(得分:0)
试试这个......
select top 5 number from
(
select
top 20 (ID) as number
from
news order by date desc
)
as number
编辑 FOR MS SQL
使用LIMIT for MYSQL