#mysql #plot #bar-chart #dimple.js
Вопрос:
Я пытаюсь построить сложенные суммы с помощью dimple для каждой недели в году.
- На оси x должны отображаться номера недель, от 1 до 52.
- По оси y отображаются сложенные суммы,поступающие из 3 таблиц,которые мы хотим отобразить в виде категорий A, B, C.
Верхний график-это почти то, чего я хочу достичь, но отсутствуют недели, для которых нет сумм (например, недели № 22 и 24), и все недели с № 28 по № 52.
Я добавил таблицу «недели», в которой перечислены все недели с 1 по 52. Внешнее соединение выполняется для номера недели, чтобы отформатировать ось x, как видно на втором графике.
PHP — код, который извлекает данные для верхней диаграммы, выглядит следующим образом:
function utf8ize($d) {
if (is_array($d))
foreach ($d as $k => $v)
$d[$k] = utf8ize($v);
else
return utf8_encode($d);
return $d;
}
$sql="SELECT s.num_week, category, amount_to_plot FROM weeks RIGHT OUTER JOIN
((SELECT WEEK(date,3) AS week,'A' AS category,SUM(amount) AS amount_to_plot FROM amounts_A GROUP BY WEEK(date,3))
UNION (SELECT WEEK(date,3) AS week,'B' AS category,SUM(amount) AS amount_to_plot FROM amounts_B GROUP BY WEEK(date,3))
UNION (SELECT WEEK(date,3) AS week,'C' AS category,SUM(amount) AS amount_to_plot FROM amounts_C GROUP BY WEEK(date,3))
) r
ON s.num_week = r.week WHERE s.num_week!=53 ORDER BY s.date_debut ASC
";
$result = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection));
$amounts = array();
while($row =mysqli_fetch_assoc($result))
{
$amounts[] = $row;
}
$data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);
echo $data;
В приведенном выше коде, заменив «ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ» на «ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ», также генерируются записи json за пропущенные недели (т. Е. без каких-либо сумм в A, B или C), и это то, что мы хотим. Они выглядят так:
{"num_week":"22","category":"","amount_to_plot":""}
{"num_week":"24","category":"","amount_to_plot":""}
{"num_week":"28","category":"","amount_to_plot":""}
(...)
{"num_week":"52","category":"","amount_to_plot":""}
Однако есть побочный эффект, и график выглядит совершенно абсурдно, отображая каждую сумму в количестве 1, включая пустые значения.
Я не уверен, что этот побочный эффект может быть вызван тем фактом, что значения «категория» пусты, а также суммы для построения графика («» вместо «0,00»).
Мой вопрос в том, как это можно исправить? Я открыт для множества методов: изменения SQL-запроса, кода PHP или кода dimple.
Комментарии:
1. Это может (и, весьма вероятно, должно) быть «исправлено» в коде приложения. Однако, если бы это был я, у меня все равно возникло бы искушение начать с того, чтобы посмотреть, можно ли создать более эффективный запрос.
2. Вы правы, это может быть исправлено в коде приложения, учитывая, что «» эквивалентно 0,00 или нулю для сумм. Тем не менее, я мог бы легко решить проблему на уровне PHP, просто не используя функцию utf8ize (), которая здесь была совершенно не нужна и имела побочный эффект. Что касается запроса, я согласен, что он не оптимизирован, но я хочу сохранить три отдельные таблицы, так как это облегчает другие запросы. Таблицы не имеют точно такой же структуры (я упростил вопрос здесь.). Способ передачи данных в столбчатую диаграмму с димплом также довольно болтлив из-за характера димпла.
Ответ №1:
Было два виновника, один на уровне приложения, другой в моем PHP-коде.
На прикладном уровне проблема возникает из-за того, что библиотеке диаграмм dimple не нравится пустое значение для суммы, которую нужно построить: ... {"num_week":"22","category":"","amount_to_plot":""} ...
Используя статическую строку json, я мог бы подтвердить, что проблема была решена, добавив значения «0.00» : ... {"num_week":"22","category":"","amount_to_plot":"0.00"} ...
Но самым простым решением было адаптировать PHP-код. Проблема была вызвана utf8ize()
функцией в моем PHP-коде, которая заменила нулевые значения на «0.00».
Вместо $data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);
просто используйте $data = json_encode($amounts);
для передачи данных в dimple.
Тогда данные будут выглядеть так ...{"num_week":"22","category":null,"amount_to_plot":null} ...
Если строка json напечатана непосредственно после ее повторения в PHP, она будет выглядеть странно для символов с акцентом (так как будет использоваться кодировка utf-8), но она будет отлично работать в качестве канала данных для диаграммы ямочек, а также для ее легенды.
Еще одним возможным улучшением было бы заменить "category":null
"category":<some-existing-category>
на, чтобы избежать пустой категории в легенде.