代码之家  ›  专栏  ›  技术社区  ›  TJ L

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

  •  1
  • TJ L  · 技术社区  · 17 年前

    我试图从一个表中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 回复  |  直到 17 年前
        1
  •  6
  •   meouw    17 年前

    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

        2
  •  1
  •   Chad Birch    17 年前

        3
  •  0
  •   Michał Tatarynowicz    17 年前

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

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

    $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个 date ,然后按对结果数组进行排序 views 在PHP中,最后选择最上面的5项(我猜这就是SilentGhost在注释中的意思)。

        5
  •  0
  •   Eppz    17 年前

    试试这个。。。

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

    编辑

    使用MYSQL的限制