使用PHP将MySQL Query转换为JSON

时间:2015-10-31 17:36:15

标签: php mysql json

我有一个关于使用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对象,但我不知道如何做到这一点。

3 个答案:

答案 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) );