Php mysql查询未选择空列

Php mysql查询未选择空列,php,mysql,null,notnull,Php,Mysql,Null,Notnull,我正在使用 $result=mysql_query("SELECT * FROM mobiles"); 此mobiles表有9列,如下所示: id,name,imei1,imei2,imei3,imei4,imei5,qty,price 一些imei字段将为空,我不想在查询中选择这些字段,因为在每一行中,NULL、not NULL是不同的 我需要询问是否存在只选择非空/非空列的查询 正常情况下,mysql\u num\u fields()返回值9,如果imei4和imei5为空,则应返回值7

我正在使用

$result=mysql_query("SELECT * FROM mobiles");
mobiles
表有9列,如下所示:

id,name,imei1,imei2,imei3,imei4,imei5,qty,price
一些imei字段将为空,我不想在查询中选择这些字段,因为在每一行中,NULL、not NULL是不同的

我需要询问是否存在只选择非空/非空列的查询

正常情况下,
mysql\u num\u fields()
返回值9,如果imei4和imei5为空,则应返回值7。。等等

我也可以将其硬编码为
,其中imei1不为NULL
,但我希望生成它,而不是硬编码

我寻找这种查询的原因是

<select class="form-sell" name="imei">
<?php if(!empty($row['imei1'])){?><option value="<?php echo $row['imei1']; ?>"><?php echo $row['imei1']; ?></option><?php } ?>
<?php if(!empty($row['imei2'])){?><option value="<?php echo $row['imei2']; ?>"><?php echo $row['imei2']; ?></option><?php } ?>
<?php if(!empty($row['imei3'])){?><option value="<?php echo $row['imei3']; ?>"><?php echo $row['imei3']; ?></option><?php } ?>
<?php if(!empty($row['imei4'])){?><option value="<?php echo $row['imei4']; ?>"><?php echo $row['imei4']; ?></option><?php } ?>
<?php if(!empty($row['imei5'])){?><option value="<?php echo $row['imei5']; ?>"><?php echo $row['imei5']; ?></option><?php } ?>
</select>
答复


我唯一能想到的就是使用这样的查询:

SELECT
  id, name,
  CONCAT_WS(',', imei1, imei2, imei3, imei4, imei5) as imei,
  qty, price
FROM
  mobiles

CONCAT_WS将创建一个字符串,其中所有imei都用逗号分隔,跳过空值。

我唯一能想到的是使用如下查询:

SELECT
  id, name,
  CONCAT_WS(',', imei1, imei2, imei3, imei4, imei5) as imei,
  qty, price
FROM
  mobiles

CONCAT_WS将创建一个字符串,其中所有imei都用逗号分隔,跳过空值。

此设计的更好方法是规范化数据库。比如:

Select e.id,e.name,p.imei,p.order
from entity e
inner join phone p
on p.entity_id = e.id

您的查询将类似于:

Select e.id,e.name,p.imei,p.order
from entity e
inner join phone p
on p.entity_id = e.id

这种设计的更好方法是规范化数据库。比如:

Select e.id,e.name,p.imei,p.order
from entity e
inner join phone p
on p.entity_id = e.id

您的查询将类似于:

Select e.id,e.name,p.imei,p.order
from entity e
inner join phone p
on p.entity_id = e.id


这将为同一实体分配不同的ID。这可能是可能的,也可能是不可能的,但无论如何它与海报的原始编号不同。我们需要更多的细节来进行规范化设计。据我所知,你说的是你的名字?因此,我会将其更新为规范化设计。我刚刚将我的问题更新为我要完成的内容以及我为什么要寻找该查询。:)嗯,我不熟悉这种方法,但感谢这个想法,我也将学习这个想法。。。eEntity->Phone这是标准化的方式。这意味着,如果您需要一个以上的imei,您将不需要创建另一列。您只需向表中添加另一行即可。这将为同一实体分配不同的ID。这可能是可能的,也可能是不可能的,但无论如何它与海报的原始编号不同。我们需要更多的细节来进行规范化设计。据我所知,你说的是你的名字?因此,我会将其更新为规范化设计。我刚刚将我的问题更新为我要完成的内容以及我为什么要寻找该查询。:)嗯,我不熟悉这种方法,但感谢这个想法,我也将学习这个想法。。。eEntity->Phone这是标准化的方式。这意味着,如果您需要一个以上的imei,您将不需要创建另一列。您只需向表中添加另一行。感谢您的快速回复,好的,我尝试过,但它将mysql_num_fileds值返回为5,而第1行中有7个非空列,第2行中有6个非空列。此外,imei值不会单独返回,而是为空。在这里,我看到所有imei列的值都是1 imei。。无法理解that@digitiZer我的查询总是返回5列,所有imei值都返回一个名为“imei”的字符串,以逗号分隔。这并不完全是你想要的,但取决于你想要的是什么,这可能是一个解决方案,现在我开始不理会这个问题。好吧,它做的是把5个伊梅柱放进一个逗号,哇。。。我喜欢它。。。因为这是我之前尝试的,将所有imei添加到一个由逗号分隔的imei列中,但不知道如何分别检索它们。其变量的每个值,例如“imei”列中的12123123412345123456将显示为$val1=12、$val2=123,依此类推@数字化仪也许您可以在php中使用explode函数?在这里可以看到,但在我的查询和分解中,如果imei1为空,并且您尝试获取第一个imei,您将获得imei2,我不确定这是否是您正在寻找的。好吧,我假设我尝试获得的结果可能不可能与我试图操纵它的方式有关。。(imei列不是硬编码的,因此可以稍后添加,而无需更改代码)。。。所以我用一种你可以说的非专业的方式把它整理出来。。请看问题,答案贴在最后。谢谢你的努力:)谢谢你的快速回复,好的,我试过了,但它返回的mysql_num_fileds值为5,而第1行有7个非空列,第2行有6个非空列。此外,imei值不会单独返回,而是为空。在这里,我看到所有imei列的值都是1 imei。。无法理解that@digitiZer我的查询总是返回5列,所有imei值都返回一个名为“imei”的字符串,以逗号分隔。这并不完全是你想要的,但取决于你想要的是什么,这可能是一个解决方案,现在我开始不理会这个问题。好吧,它做的是把5个伊梅柱放进一个逗号,哇。。。我喜欢它。。。因为这是我之前尝试的,将所有imei添加到一个由逗号分隔的imei列中,但不知道如何分别检索它们。其变量的每个值,例如“imei”列中的12123123412345123456将显示为$val1=12、$val2=123,依此类推@数字化仪也许您可以在php中使用explode函数?在这里可以看到,但在我的查询和分解中,如果imei1为空,并且您尝试获取第一个imei,您将获得imei2,我不确定这是否是您正在寻找的。好吧,我假设我尝试获得的结果可能不可能与我试图操纵它的方式有关。。(imei列不是硬编码的,因此可以稍后添加,而无需更改代码)。。。所以我用一种你可以说的非专业的方式把它整理出来。。请看问题,答案贴在最后。谢谢你的努力:)