在 php 中优化和美化又长又丑的 sql 查询

optimize and beautify long and ugly sql query in php

我是 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)。我当然可以写它,它对我很有用,但我想学习如何以一种好的方式做到这一点。 感谢理解

你可以试试这个

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')

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

SUM(skaicius) * **4**

将数字保存在乘数列中并使用类似这样的方式进行查询

SUM(skaicius) * multiplier

并且您可以缩小 rdkodas 的查询

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

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

$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 数据库之前对其进行测试。您可以 echo createQuery($nums); 在 php 页面上查看您将进行什么样的查询,以及它是否与上面的匹配。

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

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