获取非空值的计数

时间:2015-03-16 01:41:59

标签: php mysql sql

我到处都看过如何做到这一点,看起来输出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;?>

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

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以使用此结构计算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是&#34; 1&#34;,所以你可以添加它们以获得匹配的总数。

答案 1 :(得分:0)

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

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

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有一个pivot命令,但你可以通过编写一个动态生成SQL语句的存储过程来模仿它,因为它会读取内置的INFORMATION_SCHEMA COLUMNS表。

动态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
...

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