Php 从20个整数中选择最多5个整数

Php 从20个整数中选择最多5个整数,php,sql,mysql,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 D

我试图从一个表中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);

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

为什么不单独运行第一个(内部)查询,并以编程方式创建第二个查询

$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);
或者这种性质的东西


更新:或者您只需获取按日期排序的前20个,然后在PHP中按视图对结果数组进行排序,最后获取最上面的5项(我猜这就是SilentGhost在注释中的意思)。

为什么不单独运行第一个(内部)查询,并以编程方式创建第二个查询

$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);
或者这种性质的东西


更新:或者您只需获取按日期排序的前20个,然后在PHP中按视图对结果数组进行排序,最后获取最上面的5项(我猜这就是SilentGhost在注释中的意思)。

如果您在通过SQL运行时遇到很多问题,我建议从数据库中抓取最近的20篇文章,然后用PHP进行处理,找到浏览量最大的5篇。您可以在行上循环,也可以将其全部加载到一个数组中并对其进行排序。

如果您在通过SQL使其工作时遇到很多问题,我建议您从数据库中获取20篇最新文章,然后在PHP中对其进行处理,以找到5篇浏览量最大的文章。您可以在行上循环,也可以将其全部加载到一个数组中并对其进行排序。

因为我想不出任何方法可以在单个查询中实现这一点,所以我建议要么选择代码中最前面的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);

因为我想不出任何方法可以在一个查询中实现这一点,所以我建议要么选择代码中的前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);
试试这个

select top 5 number from
(
    select 
         top 20 (ID) as number
    from 
        news order by date desc
)
as number
为MS SQL编辑

使用MYSQL的限制试试这个

select top 5 number from
(
    select 
         top 20 (ID) as number
    from 
        news order by date desc
)
as number
为MS SQL编辑


使用MYSQL的限制

我刚刚测试了这个,它可以工作

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

我刚刚测试了这个,它可以正常工作

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

那么手动选择这5个结果可能会更容易,然后手动选择这5个结果可能会更容易。是的,我开始认为我可能不得不这样做。但我想一定有一种方法可以在SQL中实现。是的,我开始认为我可能必须这样做。但我想一定有一种方法可以在SQL中实现。哥们,他说他的SQL版本不支持限制(我不知道他是如何做到的,但就是这样)。在回答之前试着阅读整个问题。老兄,他说他的SQL版本不支持限制(我不知道他是怎么做到的,但你看吧)。在回答之前试着阅读整个问题。谢谢,这很有效。很明显,限制错误只出现在WHERE类型语句中的子查询中。谢谢,这很有效。很明显,限制错误仅出现在WHERE类型语句中的子查询中。