【问题标题】:Select max 5 integers from set of 20从 20 个整数中选择最多 5 个整数
【发布时间】:2010-10-05 04:36:42
【问题描述】:

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

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

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    我刚刚测试过,它可以工作

    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

    【讨论】:

    • 谢谢,这很好用。显然,限制错误仅出现在 WHERE 类型语句中的子查询中。
    【解决方案2】:

    如果您在通过 SQL 运行时遇到很多问题,我建议您只从数据库中获取 20 篇最新文章,然后在 PHP 中对其进行处理以找到 5 篇浏览次数最多的文章。您可以循环遍历行,或者将其全部加载到数组中并对其进行排序。

    【讨论】:

    • 是的,我开始认为我可能不得不这样做。但我认为必须有一种方法可以在 SQL 中完成。
    【解决方案3】:

    由于我想不出任何方法可以在单个查询中做到这一点,我建议要么选择代码中的前 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】:

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

      $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 对结果数组进行排序,最后取出5 个最上面的项目(我猜这个是 SilentGhost 在评论中的意思)。

      【讨论】:

      • 那么手动选择这 5 个结果会更容易
      【解决方案5】:

      试试这个...

      select top 5 number from
      (
          select 
               top 20 (ID) as number
          from 
              news order by date desc
      )
      as number
      

      编辑 FOR MS SQL

      对 MYSQL 使用 LIMIT

      【讨论】:

      • 老兄,他说他的 My SQL 版本不支持 LIMIT(我不知道他是如何做到的,但你去吧)。尝试在回答之前阅读整个问题。
      猜你喜欢
      • 2019-08-08
      • 2011-08-10
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      相关资源
      最近更新 更多