0

我正在使用

$result=mysql_query("SELECT * FROM mobiles");

mobiles表有 9 列

id,name,imei1,imei2,imei3,imei4,imei5,qty,price

一些imei字段将是/是空的,我不想在查询中选择,因为在每一行中NULL,NOT NULL都是不同的。

我需要询问是否有任何查询将只选择非空/空的列。

正常方式,mysql_num_fields()返回值 9,如果 imei4 和 imei5 为空,则返回值 7.. 等等

我也可以硬编码它,WHERE imei1 IS NOT 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>

我知道这不是获取硬编码值的便捷方法,但是一旦我能够获取 mysql_num_fields 值并从该值中减去 4,我将在循环中获取它们,例如

$value = mysql_num_fields($result)
$numColums = $value-4;
// Now as from my table, 3 is left from row1 and 2 is left from row2, I can use a for loop to get the select options.

回答

<?php
$result=mysql_query("SELECT * FROM mobiles");
$columnCount = mysql_num_fields($result)-4; // subtracted static column numbers (id,name,qty,price)
?>
<select class="form-sell" name="imei">
    <?php
    // while numebr of imei fields run
    for($i=1;$i<=$columnCount;$i++){
    $imei = "imei" . $i;
        if(!empty($row[$imei])){
    ?>
<option value="<?php echo $row[$imei]; ?>"><?php echo $row[$imei]; ?></option>
<?php
        }//if
    }//for
//if at some point user adds more imei colums as 6 7 8 9 and so on, 4 colums will
//always be subtracted giving remaining imei colums only and displaying them in loop
?>
</select>
4

2 回答 2

2

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

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

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

于 2013-04-29T19:26:59.030 回答
1

这种设计的更好方法是规范化您的数据库。就像是:

在此处输入图像描述

您的查询将类似于:

Select e.id,e.name,p.imei,p.order
from entity e
inner join phone p
on p.entity_id = e.id
于 2013-04-29T19:28:18.797 回答