gpt4 book ai didi

mysql - 左联接表和内联接表不显示零(Null)值

转载 作者:行者123 更新时间:2023-11-30 21:39:12 26 4
gpt4 key购买 nike

从今天早上开始,我一直在查询某个问题。该查询将显示表 A 中的所有记录和表 B 中列的计数,如果没有出现则包括 0 值(这工作正常)但是我在join C表提取B表每条记录对应的描述时,所有0值的记录都被省略了!!

这是我的查询 1(在没有描述字段的情况下工作正常)(参见结果截图 result of Query1)

SELECT aa.awardcode, aa.year_grp, aa.awardqty, COUNT(aw.stud_code) as 
stud_count from awardallocation AS aa
LEFT JOIN awardwinner as aw
ON aa.awardcode = aw.awardcode
AND aa.year_grp = aw.year_grp
AND aw.year = '$year'
AND aa.status = 1
AND aw.awardstatus = 1
GROUP BY aa.awardcode, aa.year_grp

这是查询 2(添加描述列时不显示任何具有零值的记录)

SELECT aa.awardcode, ad.award_description, aa.year_grp, aa.awardqty, 
COUNT(aw.stud_code) from awardallocation AS aa
LEFT JOIN awardwinner as aw
ON aa.awardcode = aw.awardcode
AND aa.year_grp = aw.year_grp
INNER JOIN award as ad
ON aa.awardcode = ad.awardcode
AND aw.year = 2017
AND aa.status = 1
AND aw.awardstatus = 1
GROUP BY aa.awardcode, aa.year_grp

我应该向 Query2 添加什么条件以强制它显示零值?

注意:我正在使用 MySQL。 Column: awardcode在三张表中都存在,在Award表中是唯一的。列:year_grp 出现在 Awardallocation 和 Awardwinner 表中。

谢谢。

Tables

Expected result

最佳答案

  • 您基本上需要将 awardwinner 表上的 Where 条件转移到左连接 ON 条件。这是因为,在某些情况下,在 awardwinner 表中找不到匹配的条目,它们将作为 null 返回。但是您的 where 条件会将它们过滤掉,这就是为什么您没有得到没有获奖者的案例。
  • 现在,在不同的表上进行多个连接时,可能会出现重复的行。所以,你需要做 COUNT (DISTINCT ...)以确保不会收到重复计数。
  • 此外,我还在 Select 子句中将所有必需的列(非聚合列)添加到 Group By。请阅读:Error related to only_full_group_by when executing a query in MySql

执行以下查询:

SELECT aa.awardcode, 
ad.award_description,
aa.year_grp,
aa.awardqty,
COUNT(DISTINCT aw.stud_code) AS stud_code_count
FROM awardallocation AS aa
INNER JOIN award as ad
ON aa.awardcode = ad.awardcode
LEFT JOIN awardwinner as aw
ON aa.awardcode = aw.awardcode
AND aa.year_grp = aw.year_grp
AND aw.year = 2017
AND aw.awardstatus = 1
WHERE aa.status = 1
GROUP BY aa.awardcode,
ad.award_description,
aa.year_grp,
aa.awardqty

另外:如果您不想将这些 Where 条件添加到 Join,您可以为 IS NULL 添加一个 OR 条件(以便所有情况都可以来)。

您可以改为执行以下操作:

SELECT aa.awardcode, 
ad.award_description,
aa.year_grp,
aa.awardqty,
COUNT(DISTINCT aw.stud_code) AS stud_code_count
FROM awardallocation AS aa
INNER JOIN award as ad
ON aa.awardcode = ad.awardcode
LEFT JOIN awardwinner as aw
ON aa.awardcode = aw.awardcode
AND aa.year_grp = aw.year_grp
WHERE aa.status = 1
AND (aw.year = 2017 OR aw.year IS NULL)
AND (aw.awardstatus = 1 OR aw.awardstatus IS NULL)
GROUP BY aa.awardcode,
ad.award_description,
aa.year_grp,
aa.awardqty

关于mysql - 左联接表和内联接表不显示零(Null)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52547552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com