mysql — построение динамического оператора 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, а также должны использоваться в «части подсчета случаев». Количество ключевых слов в массиве $words является переменным. Любые советы, как я могу построить count(case.. в простом и хорошем стиле программирования?

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";

Где var_dump($sql); дает:

string (301) «SELECT count (случай, когда shorturl = ‘foo’ затем 1 конец) foo, count (случай, когда shorturl = ‘bar’ затем 1 end) bar, count (случай, когда shorturl = ‘baz’ затем 1 end) baz , ОТ your_logs
ГДЕ
ДАТА (время клика) МЕЖДУ «20170102» И «20170104» И
shorturl IN (‘foo’, ‘bar’, ‘baz’)
Group By Datum «

С уважением к стилю программирования — вы должны определенно изучить готовые заявления.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]