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

MYSQL Query Fill Gaps with Data with LEFT JOIN

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

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

我现在一直在尝试将 LEFT JOIN 查询写入 select 当前一周的所有早晨值,并将其与第二个 table 结合以用零填充日期间隙,但我不能让它工作。任何帮助将不胜感激。

查询:

$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";

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

Table价格:

user price_date morning afternoon
lpepper 2021-03-15 23 35
lpepper 2021-03-17 43 52
lpepper 2021-03-18 24 35
lpepper 2021-03-19 78 85

Table 日历(部分 - 全年)

datefield morning afternoon
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

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

数组应该是:23,0,43,24,78,0,0

我在 return 上面的查询:,0,0,0

制作我正在做的阵列:

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

然后在图表中使用时:

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

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

如果您对另一个 table 有条件,则需要将它们放在 ON 子句中。如果 c.datefield 不匹配,您将获得 p 列的 NULL,并在 WHERE 中测试它们将过滤掉这些行。

日期应该从 calendar table 中过滤,而不是 price。你应该 return 日期,这样你就知道这些行是干什么用的。

p.morningc.morning 取别名,以便在从结果中获取列时区分它们。

您应该按 c 中的列排序,因为缺少日期的 p.price_date 将是 NULL

$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";

DEMO

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