【问题标题】:Prevention of mutiple sql sum queries possible?可以防止多个 sql sum 查询吗?
【发布时间】:2011-06-30 00:06:00
【问题描述】:

我想防止这种情况发生:

  $florissql = "SELECT SUM(hours) FROM logs WHERE executors LIKE '%floris%'";
  $rosasql = "SELECT SUM(hours) FROM logs WHERE executors LIKE '%rosa%'";
  $lottesql = "SELECT SUM(hours) FROM logs WHERE executors LIKE '%lotte%'";

是否可以仅在一个查询中执行此操作?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试这个可以吗?

     SELECT SUM(hours) AS Hours, 'floris' AS Executor FROM logs WHERE executors LIKE '%floris%'
     UNION ALL
     SELECT SUM(hours) AS Hours, 'rosa' AS Executor FROM logs WHERE executors LIKE '%rosa%'
     UNION ALL 
     SELECT SUM(hours) AS Hours, 'lotte' AS Executor FROM logs WHERE executors LIKE '%lotte%'
    

    这将导致:

      Hours | Executor
      ----------------
      123   | floris
      456   | rosa
      789   | lotte
    

    【讨论】:

    • 实际上你运行了三个 SQL 查询而不是一个。
    • @vag 我的回答包括一个陈述,我认为这个问题实际上是在寻找。注意 3 个单独语句的 3 个 PHP 变量。
    【解决方案2】:

    这个question 向您展示了如何将GROUP BYLIKE 一起使用...然后您可以执行以下操作:

    SELECT
      CASE
        WHEN executors LIKE '%floris%'   THEN 'floris'
        WHEN executors LIKE '%rosa%' THEN 'rosa'
        WHEN executors LIKE '%lotte%' THEN 'lotte'
      END AS exec
    , SUM(hours) AS hrs
    FROM logs
    GROUP BY 
      CASE
        WHEN executors LIKE '%floris%'   THEN 'floris'
        WHEN executors LIKE '%rosa%' THEN 'rosa'
        WHEN executors LIKE '%lotte%' THEN 'lotte'
      END
    

    然后,您可以将小时总和与不同行上的 exec 相匹配。

    我链接到的那个问题向你展示了更高级的方法,以防你需要做更多这些......

    【讨论】:

      【解决方案3】:

      如果需要每个执行者的结果,则以下内容就足够了:

      SELECT executors, SUM(hours)
      FROM logs
      WHERE executors LIKE '%floris%'
      OR executors LIKE '%rosa%'
      OR executors LIKE '%lotte%'
      GROUP BY executors
      

      【讨论】:

        【解决方案4】:
        SELECT 
            sum(IF(executors LIKE '%floris%',hours,0)) as 'floris',
            sum(IF(executors LIKE '%rosa%',hours,0)) as 'rosa',
            sum(IF(executors LIKE '%lotte%',hours,0)) as 'lotte'
        FROM logs;
        

        但是,您知道,在首位使用 % 可能会影响您的数据库性能。因为在那种情况下索引将不会使用。尽量避免这种要求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-05
          • 1970-01-01
          • 2021-12-31
          相关资源
          最近更新 更多