【问题标题】:How to do mysql LEFT JOIN for Google multiple line chart (php, mysql)?如何为谷歌多折线图(php,mysql)做mysql LEFT JOIN?
【发布时间】:2019-08-17 15:04:25
【问题描述】:

我正在尝试使用两个表进行 LEFT JOIN(在 mysql/php 中)以创建用于 Google 折线图的 JSON 表。但是由于某种原因,虽然当我直接在 phpadmin 中测试相同的 sql 时,sql 没有在 json 表中填充数据,但我得到了正确的输出。

我有 2 张表 - Anxiety 和 Fatigue - 加入是根据用户 ID 和日期进行的。这两个表都有一个“评级”列,我正在尝试绘制图表,因此我正在尝试将日期、焦虑.评级、疲劳.评级放入 json 表中..

这是我正在使用的基本 php 代码:

$stmt = $pdo->prepare("SELECT anxiety.date, anxiety.rating, fatigue.rating FROM anxiety LEFT JOIN fatigue ON (anxiety.userid = fatigue.userid) AND (anxiety.date = fatigue.date");
$stmt->execute();

// set the resulting array to associative
$result = $stmt->fetchALL(PDO::FETCH_ASSOC);

$rows = array();
$table = array();

$table['cols'] = array(

array('label' => 'Date', 'type' => 'string'),
array('label' => 'Anxiety rating', 'type' => 'number'),
array('label' => 'Fatigue rating', 'type' => 'number')
);

/* Extract the information from $result */
foreach($result as $row) {

  $sub_array = array();
  $sub_array[] =  array("v" => $row["anxiety.date"]);
  $sub_array[] =  array("v" => (int) $row["anxiety.rating"]);
  $sub_array[] =  array("v" => (int) $row["fatigue.rating"]);
  $rows[] =  array("c" => $sub_array);          
}

$table['rows'] = $rows;

// convert data into JSON format
$jsontable = json_encode($table);
echo $jsontable;

如果我从 phpadmin 中运行 sql 查询,这就是我得到的结果:

2019-07-14  4 1
2019-07-09  5 NULL
2019-07-03  2 NULL
2019-07-01  3 4

这就是我得到的 JSONTable 输出(如您所见是不正确的):

{"cols":[{"label":"Date","type":"string"},{"label":"Anxiety 
rating","type":"number"},{"label":"Fatigue rating","type":"number"}],"rows":[{"c":
[{"v":null},{"v":0},{"v":0}]},{"c":[{"v":null},{"v":0},{"v":0}]},{"c":[{"v":null},
{"v":0},{"v":0}]},{"c":[{"v":null},{"v":0},{"v":0}]}]}

显然我在将数据加载到 json 表中的方式上做错了,因为 sql 查询似乎正在工作......任何解决这个问题的帮助将不胜感激......

【问题讨论】:

  • PHP 代码有一个格式错误,因为语法高亮是错误的,很确定它在第一行缺少"
  • 什么是格式错误?谢谢。
  • 没关系我修复它,如果你复制/粘贴它,检查你的运行代码是否正确..
  • 谢谢,我解决了这个问题,但问题仍然存在......
  • 这是我测试过的...$stmt = $pdo->prepare("选择焦虑.日期,焦虑.评分,疲劳.评分从焦虑左加入疲劳(anxiety.userid =疲劳.userid) AND (anxiety.date =failure.date)");

标签: php mysql linechart


【解决方案1】:

当您有类似的查询时

SELECT 
  anxiety.date,
  anxiety.rating,
  fatigue.rating
...

然后您使用PDO::FETCH_ASSOC 获取数据 - 这些值存储在一个关联数组中,该数组由不带表前缀的列名索引。所以你必须用$row["date"]而不是$row["anxiety.date"]来访问它们。但是anxiety.ratingfatigue.rating 以相同的列名返回,PHP/PDO 会将它们写在相同的索引下($row["rating"])。这意味着anxiety.rating 的值将被fatigue.rating 的值覆盖。为避免这种情况,您应该在查询中使用列别名。因此,将您的查询更改为

SELECT 
  anxiety.date,
  anxiety.rating as anxiety_rating,
  fatigue.rating as fatigue_rating
...

并使用$row["date"]$row["anxiety_rating"]$row["fatigue_rating"] 访问数据。

【讨论】:

  • 我是这个组的新手。我不知道应该如何通知 Paul Spiegel 的解决方案回答了我的问题...
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2017-09-05
  • 1970-01-01
  • 2018-05-11
相关资源
最近更新 更多