获取非空值的计数


Getting a count for non null values

我已经到处寻找如何做到这一点,这似乎是一个可怕的长方法来输出 1 个数字。

这是我的数据库的布局:

UserId         Info1    Info2    Info3   Info4   Info5   Info6   Info7
-------------------------------------------------------------------------------
user1      |   xyz   |         | abc   |  xyz  |       | abc   | 
user2      |         |  abc    |       |  def  |  ghi  | wxy   | jkl
What i want to do is return a number for example: 
User1 has completed 4 Tasks 
User2 has completed 5 Tasks       

此行中有 95 列,因此您可以理解,单独计算每一列将非常痛苦。但是,我只想计算不为空的那些并返回一个数字。

<?
$sql="SELECT * FROM builder WHERE userid = '".$userid."' IS NOT NULL";
$query=mysql_query($sql);    
$num=mysql_num_fields($query);
echo $num;?>

这输出总共有多少行,无论它们是否为空,因此数字始终相同,这不是我想要的。

有什么建议吗?

您可以使用以下构造计算 MySQL 中的值:

select ((info1 is not null) +
        (info2 is not null) +
        (info3 is not null) +
        (info4 is not null) +
        (info5 is not null) +
        (info6 is not null) +
        (info7 is not null)
       ) as NumNotNull

MySQL在数字上下文中将布尔表达式视为整数。 TRUE 是"1",因此您可以将它们相加以得到匹配的总数。

对于这里的部分答案,我深表歉意(即我还没有写出建议的存储过程),但也许这对你来说是一个开始。我的方法需要一些时间来编写,但如果新任务有时会作为新列添加到构建器表中,这将特别有用。

方法如下:创建透视数据的存储过程。然后查询该过程生成的结果集,以便查询如下所示的数据集:

userID  task   Complete
------  ----   --------
user1   Info1  True
user1   Info2  False
user1   Info3  True
user1   Info4  True
user1   Info5  False
user1   Info6  True
user1   Info7  False
user2   Info1  False
user2   Info2  True
user2   Info3  False
user2   Info4  True
user2   Info5  True
user2   Info6  True
user2   Info7  True

我不相信 MySQL 有透视命令,但您可以通过编写一个存储过程来模仿一个,该过程在读取内置的 INFORMATION_SCHEMA 列表时动态生成 SQL 语句。

动态 SQL 如下所示:

SELECT userID, 'Info1' AS Task, info1 IS NOT NULL FROM builder
UNION
SELECT userID, 'Info2' AS Task, info2 IS NOT NULL FROM builder
UNION
...

你必须玩一段时间,但我认为它会给你一个可能更有用的结果。 顺便说一句,如果可以重新设计生成器表,则看起来像此存储过程返回的设计可能更容易使用。