从20的一组中选择最多5个整数

时间:2009-02-03 15:48:24

标签: php sql mysql

我正在尝试从表格中最近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);

任何人都对如何构建此查询有任何建议?

5 个答案:

答案 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