【问题标题】:Displaying number of results from a MySQL db显示来自 MySQL 数据库的结果数
【发布时间】:2010-02-02 21:25:52
【问题描述】:

我有一个分类网站,它使用 MySQL 作为数据库。

我的目标是显示数据库中私人、公司和总广告的数量,并在表单内的文本输入中输入搜索词!

问题: 有两种类型的广告:PrivateCompany。 用户可以指定显示哪个,或两者都显示,这就是three 选项。

在网站上,显示搜索结果后,我想向用户显示THREE标签:All adsPrivate adsCompany ads

我在 MySQL 的每条记录中都有一个 field,其中包含 Private or Company 的值。

我知道一种显示私人广告、公司广告和 TOTAL 广告数量的方法,但它需要 multiple queries

例如,如果用户选中 PRIVATE ONLY 复选框,则只搜索私人广告,但我不知道有多少公司广告,直到我进行新查询,我也在其中搜索公司广告。然后添加它们,我还有广告的总数。

只是想知道你是否知道一个好方法,也许可以摆脱额外的查询?

谢谢

【问题讨论】:

    标签: php sql mysql database search


    【解决方案1】:

    你可以使用ROLLUP:

    SELECT
        IFNULL( field , 'All ads' ) AS 'Type',
        COUNT( * )
    FROM
        `table`
    GROUP BY
        field
    WITH ROLLUP
    

    因此,如果有四个公司和一个私人广告,您会看到:

    Type       COUNT( * )
    Company    4
    Private    1
    All ads    5
    

    【讨论】:

    • +1 我以前从未见过这个条款,只是检查了文档。我可以想象,这是非常强大的!谢谢!
    • 我也不知道 ROLLUP。这很整洁。不过,我确实想知道,如果对每一行进行 IFNULL 处理会比在 PHP 中简单地将两个数字相加会导致性能下降。
    • @Brock - 我怀疑 IFNULL 会产生很大的影响。到应用时,数据集将仅下降到分组的行。也许更有可能的是 WITH ROLLUP 本身可能很昂贵。一个优点是调用代码被简化了。
    【解决方案2】:
    SELECT field , COUNT( id ) 
    FROM db
    GROUP BY field;
    

    【讨论】:

    • +1,这就是我们有数据库的原因:数据转换。当然,查询比搜索平面文件更有意义,当然,但它们不仅仅是一个存储引擎。如果你有机会让数据库完成它所构建的工作,那就去做吧!
    【解决方案3】:

    一次查询所有数据并将其传递给 PHP。一旦你在 PHP 中设置了三个单独的循环。例如:

    foreach($data AS $row)
    {
        if($row['type'] == 'company')
        {
            // LOOP THROUGH COMPANY DATA
        }
    }
    
    foreach($data AS $row)
    {
        if($row['type'] == 'private')
        {
            // LOOP THROUGH PRIVATE DATA
        }
    }
    

    这样您只需提取一次数据集,但您可以在每个选项卡中分别显示您想要的数据集。

    如果您只想要计数,请在选择计数时使用 GROUP BY 子句。

    【讨论】:

    • 从大规模数据的角度来看,这非常可怕。当您有 100,000 多行数据,并且用户没有查看所有广告时,您将返回大量您知道不需要的数据。而是让数据库完成它的工作,返回计数并且只返回您知道您需要的数据。
    • @macabail 你是对的,我相信我实际上误读了这个问题并且没有意识到我们只是在谈论计数。我预计他想在选项卡上显示计数,并在选项卡内列出正文(如表格中)。如果是这种情况,那么单个查询将是可行的方法。我不知道我在哪里得到的印象是他在标签上显示数据.. 一定是困了.. =) 不过我的想法很好!
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多