零(null)值不显示在左侧和内部联接表中

1u4esq0p  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(361)

从今天早上开始,我一直在问一个问题。查询将显示表a中的所有记录和表b中某列的计数,如果没有出现,则其中包含0值(这很正常),但当我加入表c以从表b中提取每个记录的相应描述时,所有0值记录都将被忽略!!
这是我的查询1(工作良好,无描述字段)(见查询1结果截图)

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。列:awardcode在所有三个表中都存在,并且在奖励表中是唯一的。列:awardallocation和awardwinner表中显示年份grp。
谢谢您。

8zzbczxx

8zzbczxx1#

你需要基本上改变你的工作环境 awardwinner 表向左连接 ON 条件。这是因为,在某些情况下,在 awardwinner 表,它们将作为 null . 但是你的 where 条件将过滤掉他们,这就是为什么你没有得到的情况下,没有获奖者。
现在,由于在不同的表上有多个联接,所以有可能出现重复的行。因此,您需要执行count(distinct…),以确保不会收到重复的计数。
此外,我还将select子句中所有必需的列(非聚合列)添加到groupby中。do read:在mysql中执行查询时,只与\u full \u group \u by相关的错误
执行以下查询:

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条件添加到连接中,可以添加 OR 的条件 IS NULL (这样所有的案子都能来)。
您可以改为执行以下操作:

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

相关问题