MYSQL 查询使用 LEFT JOIN 填充数据空白

劳伦斯·P。

我正在查询一个 MYSQL 数据库,它有一个名为 PRICE 的表,其中包含以下字段:用户、价格日期、上午、下午。我正在获取当前用户当前一周的所有早盘价格,以用作 JS.Charts 折线图中的数组。我遇到的问题是可能缺少天数,因此我从查询创建的数组在图表中创建了日期间隔。

我创建了另一个名为日历的表,其中包含三个字段:日期字段、上午、下午。我用今年的日期 (YYYY-MM-DD) 以及上午和下午值的 0 填充它。

我现在一直在尝试编写一个 LEFT JOIN 查询来选择当前一周的所有早晨值,并将其与第二个表连接以用零填充日期间隙,但我无法让它工作。任何帮助将不胜感激。

查询:

$sql = "SELECT p.morning, c.morning 
        FROM price p 
        LEFT JOIN calendar c ON p.price_date = c.datefield 
        WHERE p.user = '$user' AND YEARWEEK(p.price_date) = YEARWEEK(NOW()) 
        ORDER BY p.price_date";

正在使用的数据和输出的内容:

表价:

用户 价格日期 早上 下午
辣椒 2021-03-15 23 35
辣椒 2021-03-17 43 52
辣椒 2021-03-18 24 35
辣椒 2021-03-19 78 85

表日历(部分 - 适用于全年)

日期字段 早上 下午
2021-03-15 0 0
2021-03-16 0 0
2021-03-17 0 0
2021-03-18 0 0
2021-03-19 0 0
2021-03-20 0 0
2021-03-21 0 0

我需要查询返回本周(M 到 SUN)的早间价格,并为缺失的日期填充零:

数组应为:23,0,43,24,78,0,0

我上面的查询返回: ,0,0,0

为了制作我正在做的数组:

$result = mysqli_query($conn, $sql);
    $morning = array(); 
    while ($row = mysqli_fetch_assoc($result))  
    {
        $morning[] = $row["morning"]; 
    } 

然后在图表中使用时:

<?php echo implode(", ", $morning); ?>
巴马

在 a 中LEFT JOIN,包含所有应该在输出中的行的表应该是第一个。

如果其他表上有条件,则需要将它们放在ON子句中。如果没有比赛c.datefield,你会得到NULLp列,并在测试他们WHERE将这些行过滤掉。

日期应该从calendar表格中过滤掉,而不是price. 您应该返回日期,以便您知道行的用途。

p.morningand 指定别名c.morning以便在从结果中获取列时可以区分它们。

您应该按 中的列排序c,因为p.price_dateNULL用于缺少的日期。

$sql = "SELECT c.datefield, IFNULL(p.morning, 0) AS price_morning, c.morning AS cal_morning
        FROM calendar c
        LEFT JOIN price p ON p.price_date = c.datefield 
            AND p.user = '$user'
        WHERE YEARWEEK(c.datefield) = YEARWEEK(NOW()) 
        ORDER BY c.datefield";

演示

在一个不相关的说明中,您应该使用准备好的语句而不是将变量替换到 SQL 中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章