1

コードのその部分があり、動的 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 Array 内のキーワードの数は可変です。count(case..簡単で優れたプログラミング スタイルでを構築するためのヒントはありますか?

4

1 に答える 1

1

配列を反復して、$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";

avar_dump($sql);が与える場所:

string(301) "SELECT count(shorturl = 'foo' の場合は 1 end) foo, count(shorturl = 'bar' の場合は 1 end) bar, count(shorturl = 'baz' の場合は 1 end) baz , FROM your_logs WHERE DATE(click_time) BETWEEN '20170102' AND '20170104' AND shorturl IN ('foo','bar','baz') Group By Datum"

プログラミング スタイルに関しては、準備済みステートメントを確認する必要があります。

于 2017-01-04T14:42:15.993 に答える