php - “NOT NULL”、“IS NOT NULL”不显示在表中
问题描述
问题
Null 列和 Not null 列不显示在表中
说明
*我想显示来自不同数据库表的所有结果,从表 1 到下面的表 4,但它只显示那些已经有 4 个结果数据的人。我怎样才能做到这一点?对不起,我是数据库领域的新手。希望大家能给我一些参考或相关*
我的查询
<?php
$sql = "SELECT virtualexam.rank.id, virtualexam.rank.username,
virtualexam.rank.score AS score, virtualexam1.rank.score AS 'score1', virtualexam2.rank.score AS 'score2', virtualexam3.rank.score AS 'score3',
SUM(virtualexam.rank.score + virtualexam1.rank.score + virtualexam2.rank.score + virtualexam3.rank.score ) AS 'total'
FROM virtualexam.rank
JOIN virtualexam1.rank ON (virtualexam.rank.username = virtualexam1.rank.username)
JOIN virtualexam2.rank ON (virtualexam2.rank.username = virtualexam1.rank.username)
JOIN virtualexam3.rank ON (virtualexam3.rank.username = virtualexam2.rank.username)
WHERE virtualexam.rank.score IS NULL OR virtualexam.rank.score = ''
GROUP BY virtualexam.rank.username ; ";
$result = $conn->query($sql);
?>
解决方案
当您说 justJOIN
时,它需要一条记录存在于连接表中。如果您希望它是可选的,请LEFT JOIN
改用。然后,如果连接的表不存在,对其中列的引用将给出 NULL。为了防止virtualexam.rank.score + virtualexam1.rank.score + virtualexam2.rank.score + virtualexam3.rank.score
在添加的任何内容为 NULL 时返回 NULL,您需要使用 coalesce。所以:
SELECT
virtualexam.rank.id,
virtualexam.rank.username,
virtualexam.rank.score AS score,
virtualexam1.rank.score AS 'score1',
virtualexam2.rank.score AS 'score2',
virtualexam3.rank.score AS 'score3',
SUM(COALESCE(virtualexam.rank.score,0) + COALESCE(virtualexam1.rank.score,0) + COALESCE(virtualexam2.rank.score,0) + COALESCE(virtualexam3.rank.score) ) AS 'total'
FROM virtualexam.rank
LEFT JOIN virtualexam1.rank ON (virtualexam.rank.username = virtualexam1.rank.username)
LEFT JOIN virtualexam2.rank ON (virtualexam2.rank.username = virtualexam1.rank.username)
LEFT JOIN virtualexam3.rank ON (virtualexam3.rank.username = virtualexam2.rank.username)
WHERE virtualexam.rank.score IS NULL OR virtualexam.rank.score = ''
GROUP BY virtualexam.rank.username
这仍然只报告具有 virtualexam.rank 条目的用户。如果你想包括那些没有但在任何其他数据库中有条目的人,你必须这样做:
FROM (
SELECT DISTINCT username FROM virtualexam.rank
UNION SELECT DISTINCT username FROM virtualexam1.rank
UNION SELECT DISTINCT username FROM virtualexam2.rank
UNION SELECT DISTINCT username FROM virtualexam3.rank
) AS users
LEFT JOIN virtualexam.rank ON virtualexam.rank.username=users.username
LEFT JOIN virtualexam1.rank ON virtualexam1.rank.username=users.username
LEFT JOIN virtualexam2.rank ON virtualexam2.rank.username=users.username
LEFT JOIN virtualexam3.rank ON virtualexam3.rank.username=users.username
但这是一个非常糟糕的数据库设计。将所有分数放在一个表格中,并使用其他字段来确定分数的用途。
推荐阅读
- c# - Visual Studio 2005中断点时的奇怪行为
- c - 如何使用 Windows 句柄注册回调?
- html - Bootstrap 4 textarea填充剩余的第二列高度
- neo4j - neo4j 索引立即失败,没有错误
- angular - Angular Reactive forms - 动态创建输入字段并使用 id 获取填充输入
- apache-spark - Spark 阶段停留在待处理状态
- swift - “用户”类型的值没有成员“setIdentifer” - Swift
- github - 从 Github 存储库中提取信息
- python - 如何比较python中的两列字符串?
- objective-c - 如何为多个屏幕拍摄没有图标和窗口的桌面壁纸屏幕?