Php 从一个带有2个WHERE条件的表中计算值

Php 从一个带有2个WHERE条件的表中计算值,php,mysql,Php,Mysql,我想知道对于一件简单的事情来说,什么对性能和编程风格更好:从一个表中获取2个值的计数(下面所有查询都做相同的工作) 进行两次单独查询: SELECT count(*) FROM `a` WHERE categories_id=2 SELECT count(*) FROM `a` WHERE group_id=92 或者使用子查询 SELECT (SELECT count(*) FROM `a` WHERE categories_id=2 AS categories) ,(SELECT c

我想知道对于一件简单的事情来说,什么对性能和编程风格更好:从一个表中获取2个值的计数(下面所有查询都做相同的工作)

进行两次单独查询:

SELECT count(*) FROM `a` WHERE  categories_id=2
SELECT count(*) FROM `a` WHERE  group_id=92
或者使用子查询

SELECT (SELECT count(*) FROM `a` WHERE  categories_id=2 AS categories)
,(SELECT count(*) FROM `a` WHERE  group_id=92) AS groups)
或联合

SELECT count(*) FROM `a` WHERE  categories_id=2  
UNION 
SELECT count(*) FROM `a` WHERE  group_id=92

第一个选项,做两次选择,效率总是稍低一些,因为它涉及到数据库的额外往返。在后两者之间,union版本在理论上会稍微慢一些,因为union将导致数据库必须对值进行排序并生成union。实际上,对于两个值来说,这并不能通过查询的两个主要部分来衡量。

这三者之间的主要区别在于对结果值的处理,尽管这不是创伤性的

  • 第一个示例在两个单独的获取操作(在单独的语句上)中返回两个值
  • 第二个示例将两个值作为单个获取操作的一部分返回
  • 第三个示例在两个单独的获取操作(在同一条语句上)中返回两个值
  • 就性能而言,只有两行数据,在这三行数据之间几乎没有选择余地。第二个(两个子查询)解决方案使用单个语句最多,并且只需要一个fetch操作,因此它可能是最快的。第一种方法需要分别解析两条语句,再加上两组操作,因此它应该是最慢的。但是,你是否能够真正衡量这一点取决于很多因素。如果客户机在澳大利亚,服务器在欧洲,那么往返延迟可能意味着第二个或第三个解决方案是最好的(区别可能取决于DBMS是否使用单个客户机-服务器消息交换返回多行)。如果客户机与服务器位于同一台机器上,那么往返延迟就不那么重要了

    为了便于理解,联合版本可能足够干净;它不会让任何阅读它的人感到困惑。第一个版本可能稍微干净一些(少一个关键字),但差别很小

    如果备选方案的数量增加(超过一个
    组id
    值,或超过一个
    类别
    值),那么我认为工会在清晰性方面获胜:

    SELECT 'G' AS type, group_id, COUNT(*)
      FROM a
     WHERE group_id IN (92, 104, 137, 291)
     GROUP BY type, group_id
    UNION
    SELECT 'C' AS type, categories_id, COUNT(*)
      FROM a
     WHERE categories_id IN (2, 3, 13, 17, 19, 21)
     GROUP BY type, categories_id
    
    “类型”列允许您区分共享相同ID号的组ID和类别ID(尽管它们是两种不同类型的ID)


    因为它更容易扩展,我可能会选择选项3(UNION),除非对实时数据进行了令人信服的计时实验,以表明选项2(子查询)实际上更快。

    使用
    UNION ALL
    将删除“排序”步骤。