[英]"NOT NULL", "IS NOT NULL" does not display in the table
PROBLEM问题
Null column and Not null column does not display at the table空列和非空列不显示在表中
Explainaton说明
*I want to display all result at rank column from different database table which is Table 1 until table 4 below, but it only display for those who already have 4 result data. *我想显示来自不同数据库表(表 1 到下面的表 4)中排名列的所有结果,但它只显示那些已经有 4 个结果数据的人。 How can i achive this?
我怎样才能做到这一点? Sorry im new in database field.
对不起,我是数据库领域的新手。 I hope you guys can give me some reference or related *
我希望你们能给我一些参考或相关*
My query
我的查询
<?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);
?> ?>
When you say just JOIN
, it requires a record to exist in the joined table.当您只说
JOIN
,它要求连接表中存在一条记录。 If you want it to be optional, use LEFT JOIN
instead.如果您希望它是可选的,请改用
LEFT JOIN
。 Then if the joined table doesn't exist, references to columns in it will give NULL.然后,如果连接的表不存在,则对其中的列的引用将给出 NULL。 To keep your
virtualexam.rank.score + virtualexam1.rank.score + virtualexam2.rank.score + virtualexam3.rank.score
from returning NULL when any of the things being added are NULL, you need to use coalesce.为了防止您的
virtualexam.rank.score + virtualexam1.rank.score + virtualexam2.rank.score + virtualexam3.rank.score
在添加的任何内容为 NULL 时返回 NULL,您需要使用合并。 So:所以:
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
This still only reports users who have a virtualexam.rank entry.这仍然只报告具有 virtualexam.rank 条目的用户。 If you want to include those who don't but do have an entry in any of the other databases, you have to do:
如果您想包括那些没有但在任何其他数据库中有条目的人,您必须执行以下操作:
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
But this is a very poor database design.但这是一个非常糟糕的数据库设计。 Put all your scores in a single table, with other fields to identify what the score is for.
将您的所有分数放在一个表格中,并使用其他字段来确定分数的用途。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.