我已经到处寻找如何做到这一点,这似乎是一个可怕的长方法来输出 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
...
你必须玩一段时间,但我认为它会给你一个可能更有用的结果。 顺便说一句,如果可以重新设计生成器表,则看起来像此存储过程返回的设计可能更容易使用。