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.morning
和 c.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";
在不相关的说明中,您应该使用准备好的语句而不是将变量替换为 SQL。
我正在查询一个 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.morning
和 c.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";
在不相关的说明中,您应该使用准备好的语句而不是将变量替换为 SQL。