【问题标题】:optimize and beautify long and ugly sql query in php优化和美化php中长而丑陋的sql查询
【发布时间】:2016-06-20 16:18:05
【问题描述】:

我是 php 初学者,我对 sql 字符串优化和美观有疑问。

$kiti_neplp = mysql_query("SELECT (SELECT coalesce(SUM(skaicius)*6, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V3')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V4')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V7')
   +(SELECT coalesce(SUM(skaicius)*8, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V9')
   +(SELECT coalesce(SUM(skaicius)*0.3, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V11')
   +(SELECT coalesce(SUM(skaicius)*0.3, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V13')
   +(SELECT coalesce(SUM(skaicius)*16, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V14')
   +(SELECT coalesce(SUM(skaicius)*8, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V16')
   +(SELECT coalesce(SUM(skaicius)*8, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V17')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V18')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V19')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V21')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V22')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V23')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V24')
   +(SELECT coalesce(SUM(skaicius)*3, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V51')
   +(SELECT coalesce(SUM(skaicius)*4, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V52')
   +(SELECT coalesce(SUM(skaicius)*16, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V34')
   +(SELECT coalesce(SUM(skaicius)*16, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V35')
   +(SELECT coalesce(SUM(skaicius)*8, 0) FROM menesiai WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V36') 
    as kiti_neplp");

我正在构建 sql 查询字符串,但它看起来真的很难看。这是构建那个又长又丑的查询的更好方法吗?因为现在我写了 10 个几乎相同的字符串(具有不同的系数和 rdkodas)。当然我可以写它,它对我很有用,但我想学习如何以一种好的方式做到这一点。 谢谢理解

【问题讨论】:

  • 您使用的数字到底有多具体?他们遵循一个模式吗?你能用 for 循环算出它们吗?
  • 我想用 10 个字段填写报表。每个字段都有带有系数(如 6、4、4、8、0.3 ....)和不同 rdkodas 参数的独特公式。所以现在我有几乎相同的 10 个又长又丑的 sql 查询

标签: php mysql optimization query-optimization


【解决方案1】:

如果你不能从这些数据中创建一个数学模式的好方法,我能想到的唯一真实的事情就是创建一个数组并将它传递给一个为你构建查询字符串的函数,这样你就不会'甚至不必看。

$nums = array(6, 0, 3, //the numbers and data you have
              4, 0, 4,
              //snip
              8, 0, 36);


function createQuery($nums) {
    $qs = "SELECT ";
    for ($i = 0; $i < count($nums); $i+= 3) { //iterating over the groups of three
        $qs = $qs . "+(SELECT coalesce(SUM(skaicius)*" . $nums[$i] .
                ", " . $nums[$i + 1] . 
                ") FROM menesiai WHERE metai = '" . $metaiat . 
                "' {$SQLmenuo} {$SQLskyrius} AND rdkodas = 'V" . 
                 $nums[$i + 2] . "')+";
    }
    return $qs = $qs . "as kiti_neplp"; //return everything as a string
}

$kiti_nlpl = mysqli_query(createQuery($nums)); //execute the query

不要按原样运行此代码!在将其部署到 SQL 数据库之前对其进行测试。您可以在 php 页面上echo createQuery($nums); 来查看您将进行什么样的查询,以及它是否与上述查询匹配。

不过,从长远来看,这种方法会对您有所帮助,尤其是当您要制作更多这些时(不寒而栗)。您可以在将 $nums 传递给函数之前将其声明为具有不同的值。通过将糟糕的部分隐藏在您不必看到的地方,这将使您的代码中实际执行查询的部分(mysqli_quer();)看起来非常好:P

【讨论】:

    【解决方案2】:

    你可以试试这个

    SELECT 
      IF (rdkodas = 'V3', coalesce(SUM(skaicius)*6, 0), 0) AS v3_sum,
      IF (rdkodas = 'V4', coalesce(SUM(skaicius)*4, 0) AS v4_sum,
      IF (rdkodas = 'V7', coalesce(SUM(skaicius)*4, 0) AS v7_sum
    FROM menesiai
    WHERE metai = '".$metaiat."' {$SQLmenuo} {$SQLskyrius} AND rdkodas IN ('V3', 'V4', 'V7')
    

    【讨论】:

      【解决方案3】:

      为什么最好保存乘数 (4)?

      SUM(skaicius) * **4**
      

      将数字保存在乘数列中并使用类似的内容进行查询

      SUM(skaicius) * multiplier
      

      您可以缩小对 rdkodas 的查询

      rdkodas in ('V4', 'V16', etc)
      

      【讨论】:

        【解决方案4】:

        SQL 格式化程序SQLinForm 从 PHP 中取出 SQL 语句,美化它们并更好地重写 PHP 代码

        【讨论】:

          猜你喜欢
          • 2011-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多