【问题标题】:Simplify select with countMySql 和 PHP - 选择计数
【发布时间】:2015-07-22 14:44:48
【问题描述】:

我需要从数据库中获取一些值并计算所有行数。

我写了这段代码:

SELECT author, alias, (select COUNT(*) from registry WHERE status='OK' AND type='H1') AS count
FROM registry
WHERE status='OK' AND type='H1'

它可以工作,但是,我怎样才能简化这段代码?两者都有WERE 条件。

谢谢。

【问题讨论】:

  • 您是否要按作者计算此标准的数量?看看使用 GROUP BY 而不是子选择
  • @ShadMickelberry:我猜他正试图输出每一行的总数。

标签: mysql sql select mysqli count


【解决方案1】:

如果查询返回您需要的结果集,“总”行数(独立于作者和别名),每行重复的“计数”值相同,我们可以像这样重写查询:

SELECT t.author
     , t.alias
     , s.count
  FROM registry t
 CROSS
  JOIN ( SELECT COUNT(*) AS `count`
           FROM registry c
          WHERE c.status='OK'
            AND c.type='H1'
       ) s
 WHERE t.status='OK'
   AND t.type='H1'

我不知道这是否更简单,但对于阅读该声明的人来说,我认为它可以更清楚地了解返回的结果集。

(我也倾向于避免在 SELECT 列表中使用任何子查询,除非有特定原因要添加。)

此查询的结果集有点奇怪。但是除了原始查询之外,没有任何示例数据、预期输出或任何规范,我们只是在猜测。我的答案中的查询以更清晰的方式复制了原始查询的结果。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT author, alias, count(1) AS caunt
    FROM registry
    WHERE status='OK' AND type='H1'
    group by author, alias
    

    【讨论】:

    • 我们应该注意,这个查询返回的结果与原始查询返回的结果显着不同。
    【解决方案3】:

    statustype 是从表中提取字段的标准。没有比这更简单的了。

    【讨论】:

      【解决方案4】:

      尝试使用分组,

      SELECT author, alias, COUNT(*) AS COUNT
      FROM registry
      WHERE STATUS='OK' AND TYPE='H1'
      GROUP BY author, alias
      

      根据您的表的设置方式,您实际上可能需要执行此操作才能获取您要查找的数据。

      一些很好的阅读:https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

      但是,如果您希望计数只是具有该条件的所有记录,那么您所拥有的可能已经是最简单的了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 2017-01-28
        • 2014-02-26
        相关资源
        最近更新 更多