在 PHP 中构建动态 sql 语句



我有那部分代码,想要构建一个动态SQL语句:

//Build IN Clause
$sql_IN="'".implode("','", $keywords)."'";
//Build COUNT Clause
//tbd
//Get Clicks from YOURLS LOG
$sql_get_clicks="
                    SELECT 
                        count(case when shorturl ='u0lg' then 1 end) u0lg, 
                        count(case when shorturl ='3a8h' then 1 end) 3a8h,  
                        count(case when shorturl ='abcd' then 1 end) abcd,  
                        DATE_FORMAT((click_time),'%d.%m.%Y') Datum
                    FROM 
                        `yourls_log` 
                    WHERE  
                         DATE(click_time) BETWEEN '20170102' AND '20170104' AND
                         shorturl IN (".$sql_IN.")
                    Group By Datum";

变量 $keywords 是一个带有关键字的数组。关键字在 IN 子句中使用,也必须在"计数大小写部分"中使用。$keywords数组中的关键字数量是可变的。如何以简单而良好的编程风格构建count(case..的任何提示?

您可以迭代 $keywords 数组并将每个值放入一个子句中,该子句附加到SELECT之后和FROM等之前。

$keywords = array("foo", "bar", "baz");
$inClause = "'".implode("','", $keywords)."'";
$sql = "SELECT ";
foreach($keywords as $key) {
  $sql.="count(case when shorturl = '".$key."' then 1 end) ".$key.", ";    
}
$sql=rtrim($sql, ", ")." ";
$sql.= "FROM `your_logs` 
  WHERE 
    DATE(click_time) BETWEEN '20170102' AND '20170104' AND
    shorturl IN (".$inClause.")
    Group By Datum";

如果var_dump($sql);提供:

string(301) "SELECT count(当 shorturl = 'foo' 然后 1 结束时的大小写) foo, count(当 shorturl = 'bar' 然后 1 结束时的大小写)

bar, count(当 shorturl = 'baz' 然后 1 结束时的大小写) baz, 从 your_logs 哪里 介于"20170102"和"20170104"之间的日期(click_time)和 shorturl IN ('foo', 'bar', 'baz') 按基准面分组"

关于编程风格 - 你绝对应该研究准备好的语句。

相关内容

  • 没有找到相关文章

最新更新