【问题标题】:mysql query do not selected null columnsmysql查询不选择空列
【发布时间】:2013-04-23 14:05:56
【问题描述】:

我正在使用

获取一些结果
$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>

【问题讨论】:

    标签: php mysql null notnull


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的快速回复,好的,我试过了,但它返回 mysql_num_fileds 值为 5,而第 1 行有 7 个 NOT NULL 列,第 2 行有 6 个 NOT NULL。此外,imei 值也不是单独返回但空白。在这里,我看到所有 imei 列的值都为 1 imei .. 无法理解
    • @digitiZer 我的查询总是返回 5 列,所有 imei 值都在一个名为“imei”的字符串中返回,用逗号分隔。这不完全是您所要求的,但取决于您的目标,它可能是一个解决方案
    • 好的,现在我开始理解 CONCAT_WS。好吧,它所做的就是将 5 个 imei 列放在一个用逗号分隔的列中,哇……喜欢它……因为这是我之前尝试的,将所有 IMEI 添加到一个用逗号分隔的 imei 列中,但不知道如何分别检索它们。其变量的每个值,例如“imei”列中的 12,123,1234,12345,123456 将显示为 $val1 = 12, $val2 = 123 等等...!
    • @digitiZer 也许你可以在php中使用explode函数?在这里看到它codepad.org/XJJ28kJA 但使用我的查询并爆炸,如果 imei1 为空并且您尝试获取第一个 imei,您将获得 imei2,我不确定这是否是您要查找的内容
    • 好吧,我认为我试图获得的结果可能与我试图操纵它的方式是不可能的..(imei 列未硬编码,因此可以稍后添加而不更改代码) ...所以我用一种你可以说的非专业方式对其进行了整理..请看问题,答案贴在最后。不过感谢您的努力:)
    【解决方案2】:

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

    您的查询将类似于:

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

    【讨论】:

    • 将为同一个实体分配不同的ID。这可能会也可能不会,但无论如何它与海报的原始编号不同。
    • 我们需要更多细节来进行标准化设计。据我了解,您在谈论名称?所以,我会将其更新为规范化设计
    • 我刚刚将我的问题更新为我想要完成的内容以及我为什么要查找该查询。 :)
    • 好吧,我不熟悉这种方法,但感谢这个想法,我也要学习这个想法...... eintity -> phone
    • 这是标准化的方式。这意味着,如果您需要更多 imei,则无需创建另一列。您只需在表格中添加另一行。
    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2021-11-19
    • 2023-04-04
    • 2019-03-19
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多