Php 如何在我的SQL中获取给定行中的空值列计数

Php 如何在我的SQL中获取给定行中的空值列计数,php,mysql,Php,Mysql,我想通过id获取给定行中的空数据列计数。 在我的表格中有15列。我希望在传递行的值id时获得空数据列计数 是否有任何mysql函数或查询可直接获取该计数?或者我必须在获取所有行数据之后使用PHP 谢谢如果您的列中为空 SELECT IF(col1 IS NULL ,1,0)+ IF(col2 IS NULL ,1,0) +IF(col3_id IS NULL ,1,0) +......AS cnt FROM yourTable WHERE id=100000 如果为空 然后 您可以使用IF

我想通过
id
获取给定行中的空数据列计数。 在我的表格中有15列。我希望在传递行的值id时获得空数据列计数

是否有任何
mysql
函数或查询可直接获取该计数?或者我必须在获取所有行数据之后使用
PHP


谢谢

如果您的列中为空

SELECT IF(col1 IS NULL ,1,0)+ IF(col2 IS NULL ,1,0) +IF(col3_id IS NULL ,1,0) +......AS cnt 

FROM yourTable
WHERE id=100000
如果为空 然后
您可以使用IF(col1='',1,0),而不是IS NULL

如果列中的值为NULL

SELECT IF(col1 IS NULL ,1,0)+ IF(col2 IS NULL ,1,0) +IF(col3_id IS NULL ,1,0) +......AS cnt 

FROM yourTable
WHERE id=100000
SELECT IF(`col1`='',1,0) + IF(`col2`='',1,0) + IF(`col3`='',1,0) + IF(`col4` ...
AS EmptyCols
WHERE `id` = 1;
如果为空 然后 如果(col1='',1,0),则可以使用,而不是IS NULL

SELECT IF(`col1`='',1,0) + IF(`col2`='',1,0) + IF(`col3`='',1,0) + IF(`col4` ...
AS EmptyCols
WHERE `id` = 1;
将每个
='
更改为
为NULL
,如果“empty”的意思是NULL。然而,对于>几个列来说,这相当长且难以维护-在PHP中进行计数可能是一个更好的主意,无论是在需要检索此值时,还是在将行作为附加列插入/更新时,您可以稍后直接查询


将每个
='
更改为
为NULL
,如果“empty”的意思是NULL。然而,对于>几个列来说,这相当长而且很难维护-在PHP中进行计数可能是一个更好的主意,无论是当您需要检索此值时,还是当该行作为附加列插入/更新时,您可以稍后直接查询。

实际上,您可以在MySQL中使用
信息模式
数据库进行计数。让它成为测试数据:

mysql> select * from test.test; +------+------+------+------+ | id | foo | bar | baz | +------+------+------+------+ | 1 | | NULL | 5 | | 2 | one | NULL | 7 | | 3 | two | four | 9 | +------+------+------+------+ 3 rows in set (0.00 sec) -然后像这样使用它:

mysql> set @sql=(select CONCAT('SELECT ', GROUP_CONCAT(CONCAT('(', column_name,' IS NULL OR ', column_name,'="")') SEPARATOR '+'), ' FROM test.test WH ERE id=@id') from information_schema.columns where table_name='test' and table_schema='test' and column_name!='id'); Query OK, 0 rows affected (0.01 sec) mysql> prepare stmt from @sql; Query OK, 0 rows affected (0.02 sec)
所以,您将能够在MySQL中实现这一点——但实际上,在您的应用程序中计数似乎是更合适的解决方案。若您仍然使用上述方法,我建议您为结果字段添加别名。

实际上,您可以在MySQL中使用
INFORMATION\u SCHEMA
数据库。让它成为测试数据:

mysql> select * from test.test; +------+------+------+------+ | id | foo | bar | baz | +------+------+------+------+ | 1 | | NULL | 5 | | 2 | one | NULL | 7 | | 3 | two | four | 9 | +------+------+------+------+ 3 rows in set (0.00 sec) -然后像这样使用它:

mysql> set @sql=(select CONCAT('SELECT ', GROUP_CONCAT(CONCAT('(', column_name,' IS NULL OR ', column_name,'="")') SEPARATOR '+'), ' FROM test.test WH ERE id=@id') from information_schema.columns where table_name='test' and table_schema='test' and column_name!='id'); Query OK, 0 rows affected (0.01 sec) mysql> prepare stmt from @sql; Query OK, 0 rows affected (0.02 sec)
所以,您将能够在MySQL中实现这一点——但实际上,在您的应用程序中计数似乎是更合适的解决方案。如果您仍然使用上述方法,我建议您为结果字段添加别名。

AFAIK,没有这样的查询可以直接告诉一行中有多少字段是空的。您必须使用php,否则需要检查循环中的每一列。您需要使用php检查内容是否为空,这样更好,mysql中没有可用的查询..你说的“空”是什么意思?这是
null
还是空字符串
''
?是的,空字符串和空字符串都是空的。好的,没有这样的查询可以直接告诉一行中有多少字段是空的。如果有其他条件,你必须使用php来检查循环中的每一列。你需要使用php来检查内容是否为空,这样更好,mysql中没有可用的查询..你说的“空”是什么意思?这是
null
还是空字符串
'
?是的,空字符串和空字符串感谢
IF(col1='''''1,0)
null
和空字段都有效如果(col1='',1,0)对
null
和空字段都有效