mysql - 从温度和 ID 数据库创建 Google Charts API 数据表

标签 mysql sql google-visualization laravel-5.3 google-datatable

我想创建一个 Annotation Chart使用数据库中的池温度数据。可以看看数据库结构here on sqlfiddlehere on rextester ,但为了节省您的点击次数,这是我正在使用的结构:

DROP TABLE IF EXISTS `temperatures`;
DROP TABLE IF EXISTS `pools`;

CREATE TABLE `pools` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `temperatures` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `pool_id` int(10) unsigned NOT NULL,
  `temperature` double(8,1) NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `temperatures_pool_id_foreign` (`pool_id`),
  CONSTRAINT `temperatures_pool_id_foreign` FOREIGN KEY (`pool_id`) REFERENCES `pools` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3173 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `pools` (`id`, `name`, `created_at`)
VALUES
    (1,'Pool #1','2017-04-08 22:48:03'),
    (2,'Pool #2','2017-04-08 22:48:03'),
    (3,'Pool #3','2017-04-08 22:48:03');

INSERT INTO `temperatures` (`id`, `pool_id`, `temperature`, `created_at`)
VALUES
    (31,1,100.1,'2017-04-09 02:44:56'),
    (32,2,104.2,'2017-04-09 02:44:56'),
    (33,3,97.0,'2017-04-09 02:44:56'),
    (34,1,100.1,'2017-04-09 03:00:04'),
    (35,2,98.4,'2017-04-09 03:00:04'),
    (36,3,96.6,'2017-04-09 03:00:04'),
    (37,1,100.1,'2017-04-09 03:37:13'),
    (38,2,101.8,'2017-04-09 03:37:13'),
    (39,3,96.4,'2017-04-09 03:37:13'),
    (40,1,100.1,'2017-04-09 04:00:04'),
    (41,2,101.8,'2017-04-09 04:00:04'),
    (42,3,96.5,'2017-04-09 04:00:04'),
    (43,1,100.1,'2017-04-09 05:00:04'),
    (44,2,101.8,'2017-04-09 05:00:04');

好吧,基本上,我创建了一个 Controller ,它将返回格式正确的 JSON 以用于 ajax 和 google.visualization.DataTable(),如下所示:

var jsonData = $.ajax({
    url: "/data/pool-temperature-timeline",
    dataType: "json",
    async: false
}).responseText;

data = new google.visualization.DataTable(jsonData);
chart.draw(data, options);

当然,查看文档,注释图表期望事物遵循以下格式:

var data = new google.visualization.DataTable();
data.addColumn('date', 'Date');
data.addColumn('number', 'Kepler-22b mission');
data.addColumn('string', 'Kepler title');
data.addColumn('string', 'Kepler text');
data.addColumn('number', 'Gliese 163 mission');
data.addColumn('string', 'Gliese title');
data.addColumn('string', 'Gliese text');
data.addRows([
    [new Date(2314, 2, 15), 12400, undefined, undefined,
                            10645, undefined, undefined],
    [new Date(2314, 2, 16), 24045, 'Lalibertines', 'First encounter',
                            12374, undefined, undefined],
    [new Date(2314, 2, 17), 35022, 'Lalibertines', 'They are very tall',
                            15766, 'Gallantors', 'First Encounter'],
    [new Date(2314, 2, 18), 12284, 'Lalibertines', 'Attack on our crew!',
                            34334, 'Gallantors', 'Statement of shared principles'],
    [new Date(2314, 2, 19), 8476, 'Lalibertines', 'Heavy casualties',
                            66467, 'Gallantors', 'Mysteries revealed'],
    [new Date(2314, 2, 20), 0, 'Lalibertines', 'All crew lost',
                            79463, 'Gallantors', 'Omniscience achieved']
]);

var chart = new google.visualization.AnnotationChart(document.getElementById('chart_div'));

好了,这就是设置,现在问题来了。组织数据的最佳方式是什么,以便 1.) 池 1、池 2 和池 3 始终有相同日期时间的温度数据(我担心给定时间戳的数据集可能不完整)?我应该使用一些聪明的查询从 SQL 层开始组织它吗?或者我是否通过使用一堆 foreach 循环在 Controller 中组织它?这是我努力的目标:

$dataTable->addRow(['created_at', 
    'temperature1', 'title1', 'text1',
    'temperature2', 'title2', 'text2',
    'temperature2', 'title2', 'text2',
]);

我认为巧妙的查询是避免在 Controller 中执行大量逻辑和 foreach 循环的好方法。也许如果数据按列组织,例如:

created_at, pool_1_temperature, pool_2_temperature, pool_3_temperature
------------------------------------------------
2017-04-09 02:44:56, 100.1, 104.2, 97.0
2017-04-09 03:00:04, 100.1, 98.4, 96.6
2017-04-09 03:37:13, 100.1, 101.8, 96.4

然后我可以很容易地完成它并创建数据表。我不确定如何在 MySQL 中执行此操作,即使这是个好主意。

感谢您抽出宝贵时间,并提前感谢您提供的任何帮助。我希望我已经足够清楚了。

附言。我猜到目前为止我遇到的最接近的事情是 Mysql query to dynamically convert rows to columns .我要再玩玩这个......

最佳答案

只要x轴(第一列)是日期,
你不需要担心...

池 1、2 和 3 始终有相同日期时间的温度数据

图表应该可以算出来

因此,您可以使用类似于以下的查询...

select
  created_at,
  case when
    pool_id = 1
  then
    temperature
  else
    null
  end pool_1,
  case when
    pool_id = 2
  then
    temperature
  else
    null
  end pool_2,
  case when
    pool_id = 3
  then
    temperature
  else
    null
  end pool_3
from
  temperatures

我无法获得提供的任​​何一个 SQL 链接,
所以我无法验证 sql

我不确定返回 null 是否有效

关于mysql - 从温度和 ID 数据库创建 Google Charts API 数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43335974/

相关文章:

php - 如何注销特定用户 session (php 和 mysql)

php - 使用 0 或 NULL 作为存储日期的 MySQL INT 字段的默认值更好吗?

mysql - 选择 B 列上的总和,其中 A 列与 mysql 相同

mysql - 在使用 'OR' 时不使用索引键

google-maps - 在谷歌地图/可视化上可视化大量数据

mysql - 有没有办法改进这个sql select功能?

sql - 在 SQL 中选择具有最密集(最少 NULL)列数据的行

javascript - 如果我使用setInterval从数据库请求数据,会损坏服务器吗?

javascript - 具有固定间隔的谷歌可视化折线图

javascript - 检索 Google Charts 中的注释文本