【问题标题】:Building counters from paginated search results...?从分页搜索结果构建计数器...?
【发布时间】:2010-03-23 16:54:53
【问题描述】:

我正在创建 eBay 风格的搜索窗格,允许用户按特定条件缩小搜索结果集。例如:

标签

文学 (8) 小说 (4) 英语 (4) 美国 (3) 非小说类(2)

具有该属性的结果的数量在括号中。最初,我通过将此代码放入显示结果循环中来构建计数器:

if(isset($tags[$row['tags']])) {
    $tags[$row['tags']]++;
} else {
$tags[$row['tags']] = 1;
}

然后我对结果进行了分页,结果停止工作 - 查询只为您所在的页面返回足够的数据,因此计数器仅代表该页面上的结果。

谁能建议另一种方法?

【问题讨论】:

    标签: php mysql search


    【解决方案1】:

    您必须对tag, COUNT(*) in <table> GROUP BY tag 运行第二次查询才能获得每个标签的总数。

    编辑:

    Check this out。这是我的一个新的,但它看起来像你想要的。

    SELECT SQL_CALC_FOUND_ROWS 开始您的查询,然后以SELECT FOUND_ROWS(); 跟进您的查询

    【讨论】:

    • 标签只是几个标准之一。如果可能的话,我宁愿避免额外的查询。
    • 您的另一个选择是做一个完整的查询,没有限制。然后您可以计算您的标签并在 PHP 中执行分页逻辑。这将是一种较重的方法,至少在 PHP 中如果不在数据库上,但它应该更灵活。
    • 你是对的,但这是一个艰难的决定——额外的查询而不是在每一页上抓取整个数据集。我想知道其他显示此类信息的网站如何构建其代码。
    • 我知道你的意思。这必须是一个普遍的问题。 FOUND_ROWS() 这个东西真的很有帮助,但我没有看到任何关于如何将它与 GROUP BY 配对的信息。
    【解决方案2】:
    SELECT COUNT(*) FROM books WHERE tagid=$tagid
    

    然而,这需要另一个查询。请提供有关您的分页方法的更多信息。

    【讨论】:

    • 我用 LIMIT 分页:$from = (($page * $results_per_page) - $results_per_page); $sql .= " LIMIT ".$from.",".$results_per_page;
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2014-03-26
    • 2017-02-24
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多