我有一个关于使用MySQL查询将我的数据转换为JSON对象的问题。我所拥有的查询是转换为JSON对象,但它没有按照我想要的方式工作。
我的数据库中有多个表格,我想在图表上绘制图形,使用日期作为X轴,值作为Y轴。我目前按日期加入表格。但是,某些表可能每天有多个提交,而其他表可能没有。目前,我所拥有的查询仅显示数据提交到所有4个表的日期的结果。
我还希望以0-10的比例绘制信息。 4个表中的3个只有0-10的值,所以我每天取每个值的平均值。营养表中包含nf_sugars和nf_total_carbohydrates的数字较大,我将使用规范化将它们转换为0-10比例。现在,我只是试图获得每天的SUM,并在此部分工作后完成剩余的计算。但是,我当前运行的查询给出的结果远远高于数据库中实际数字的SUM。
任何帮助将不胜感激!这是我目前用于创建JSON对象的PHP。作为旁注,我确实成功连接到我的数据库,我只是没有在这里包含。
$myquery = "SELECT track_ticseverity.date,
AVG(track_ticseverity.ticnum) as average_ticnum,
track_fatigue.date,
AVG(track_fatigue.fatiguenum) as average_fatiguenum,
track_stress.date,
AVG(track_stress.stressnum) as average_stressnum,
track_nutrition.date,
((SUM(track_nutrition.nf_sugars) ) ) as sum_nf_sugars,
((SUM(track_nutrition.nf_total_carbohydrate) ) ) as sum_nf_total_carbohydrate
FROM track_ticseverity
INNER JOIN track_fatigue
ON track_ticseverity.date=track_fatigue.date
INNER JOIN track_stress
ON track_fatigue.date=track_stress.date
INNER JOIN track_nutrition
ON track_stress.date=track_nutrition.date
WHERE track_ticseverity.user_id=1
AND track_fatigue.user_id=1
AND track_stress.user_id=1
AND track_nutrition.user_id=1
GROUP BY track_ticseverity.date";
$query = mysqli_query($conn, $myquery);
if ( ! $query ) {
echo mysqli_error(s);
die;
}
$data = array();
for ($x = 0; $x < mysqli_num_rows($query); $x++) {
$data[] = mysqli_fetch_assoc($query);
}
echo json_encode($data);
mysqli_close($conn);
编辑 - 查询成功返回JSON对象。我的问题是我写的查询没有以正确的方式输出数据。我需要查询来从多个表中选择信息,有些表每天提交多个表,而其他表只有一个或没有提交。
EDIT2 - 我在想另一种处理方法是将多个SELECT语句组合成一个JSON对象,但我不知道如何做到这一点。
答案 0 :(得分:1)
我更愿意使用这种方式(假设所有其他事情都正常工作,例如mat2
工作正常)
# Get column indices corresponding to index2
col_idx = np.mod(np.arange(index1,index1-p,-1),p)
# Get all mat2 values with those column indices at kth row
mat2_val = mat2[k,col_idx]
# Mask of valid elements
mask = mat2_val > -1e10
# Set valid ones in mat1 with valid ones from mat2
# after scaling with mat2[k][index1]
mat1[k][mask] = mat2[k][index1]*mat2_val[mask]
答案 1 :(得分:1)
由于连接,总和大于预期。想象一下某个约会 发生在一个track_nutrition记录和两个track_fatigue记录中,然后是连接 将使第一个表中的数据与第一个track_fatigue组合在一起 记录,然后再次记录第二条记录。因此同样的nf_sugars 价值将在总和中计算两次。此行为也会影响平均值。
因此,您应首先执行聚合,然后才执行连接。
其次,要确保捕获所有数据,即使某个日期并非所有表都有 值,你应该使用完整的外连接。这将保证每个表中的每条记录 会在结果中找到自己的方式。现在,MySQL不支持这样的完全外连接,所以 我使用额外的子选择从4个表中选择所有不同的日期然后 将其与其他汇总数据“左连接”:
SELECT dates.date,
IFNULL(average_ticnum_n, 0) as average_ticnum
IFNULL(average_fatiguenum_n, 0) as average_fatiguenum
IFNULL(average_stressnum_n, 0) as average_stressnum
IFNULL(sum_nf_sugars_n, 0) as sum_nf_sugars
IFNULL(sum_nf_total_carbohydrate_n, 0) as sum_nf_total_carbohydrate
FROM (
SELECT DISTINCT user_id,
date
FROM (
SELECT user_id,
date
FROM track_ticseverity
UNION
SELECT user_id,
date
FROM track_fatigue
UNION
SELECT user_id,
date
FROM track_stress
UNION
SELECT user_id,
date
FROM track_nutrition
) as combined
) as dates
LEFT JOIN (
SELECT user_id,
date,
AVG(ticnum) as average_ticnum_n
FROM track_ticseverity
GROUP BY user_id,
date) as grp_ticseverity
ON dates.date = grp_ticseverity.date
AND dates.user_id = grp_ticseverity.user_id
LEFT JOIN (
SELECT user_id,
date,
AVG(fatiguenum) as average_fatiguenum_n
FROM track_fatigue
GROUP BY user_id,
date) as grp_fatigue
ON dates.date = grp_fatigue.date
AND dates.user_id = grp_fatigue.user_id
LEFT JOIN (
SELECT user_id,
date,
AVG(stressnum) as average_stressnum_n
FROM track_stress
GROUP BY user_id,
date) as grp_stress
ON dates.date = grp_stress.date
AND dates.user_id = grp_stress.user_id
LEFT JOIN (
SELECT user_id,
date,
SUM(nf_sugars) as sum_nf_sugars_n,
SUM(nf_total_carbohydrate) as sum_nf_total_carbohydrate_n
FROM track_nutrition
GROUP BY user_id,
date) as grp_nutrition
ON dates.date = grp_nutrition.date
AND dates.user_id = grp_nutrition.user_id
WHERE dates.user_id = 1
ORDER BY dates.date;
请注意,如果没有相关数据,您将在某些列中获得0值
特定日期。如果您希望获得NULL
,请从这些列中删除Nvl()
在上面的查询中。
然后,要以0-10的比例标准化所有数据,您可以查看最大值 找到每种类型的值并将其用于转换,或者如果您事先知道的话 每种类型的范围是什么,那么使用该信息可能更好,并且 也许是SQL中的代码。
但是,在实际使用的图形中组合值总是有点奇怪 不同的尺度。人们可能很容易通过这些图表得出错误的结论。
答案 2 :(得分:0)
如果您使用PDO(PHP数据对象)进行数据库操作;然后可以使用以下代码从PDO创建JSON。
$array = $pdo->query("SELECT * FROM employee")->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($array);
对于多重选择,我们需要像这样尝试:
$array = $pdo->query("SELECT 1; SELECT 2;");
$array->nextRowset();
var_dump( $array->fetchAll(PDO::FETCH_ASSOC) );