我到处都看过如何做到这一点,看起来输出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;?>
这会输出总共有多少行,无论它们是否为空,所以数字总是相同的,这不是我想要的。
有什么建议吗?
答案 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
...
你必须玩这一段时间,但我认为它会给你一个更有用的结果。顺便说一句,如果可以重新设计构建器表,那么看起来像这个存储过程返回的设计可能更容易使用。