MYSQL从表格的行中选择非空的多个字段/列

时间:2016-11-03 13:31:07

标签: php mysql sql select

我在下面的代码中有12列,我想要最好,正确和简短的方法来选择表中字段不为空/ 0的用户订单(一行)的字段。(所有字段都是INT并且数字小于500)

$conn = mysqli_connect("localhost", "root", "","table_name") or die("error");
               $sql = "SELECT dqnt_91,deal_91,dqnt_92,deal_92,dqnt_93,deal_93,dqnt_94,deal_94,dqnt_95,deal_95,dqnt_96,deal_96 FROM table_name  WHERE fid='$userid' AND COLUMNS ARE NOT EMPTY ";  

                $result = mysqli_query($conn, $sql);
                    while( $row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
               $d_91 = $row['deal_91'];  $d_92 = $row['deal_92']; $d_93 = $row['deal_93'];  $d_94 = $row['deal_94']; $d_95 = $row['deal_95'];  $d_96 = $row['deal_96'];
               $qnt_91 = $row['dqnt_91']; $qnt_91 = $row['dqnt_92']; $qnt_91 = $row['dqnt_93']; $qnt_91 = $row['dqnt_94']; $qnt_91 = $row['dqnt_95']; $qnt_91 = $row['dqnt_96']; }
  echo 'You have selected:'.$d_91.'for'.$deal_91.'<br>';
  echo 'You have selected:'.$d_92.'for'.$deal_92.'<br>';

echo 'You have selected:'.$d_96.'for'.$deal_96.'<br>';

同样,我希望只回显那些非零(0)或空的字段,如果它们是零值,则不要显示或回显它们! 下面的代码可以工作,但因为我有12列,可以添加更多,然后下面的代码不方便。

SELECT [ all 12 x columns_name] FROM table_name WHERE table_name.column_name1!='' AND table_name.column_mame2!='' AND x another 10 times the last code ;

谢谢,

1 个答案:

答案 0 :(得分:0)

如果没有修改数据结构,那么在SQL中你不会比列出每个有自己条件的12列更好。而任何更短的东西都会以清晰为代价,所以我个人建议不要这样做。但如果简洁性比清晰度更重要:

如果你可以添加一个视图,它可以提供一个简单的标志供你测试。

create view my_view as (select -- each column
                             , case when -- all values are present
                                    then 1 else 0 end nonempty_flg
                          from -- ...)

然后至少隐藏了调用应用程序的复杂性。如果那不是一个选择:

您声明列是小整数值。如果你可以进一步假设它们是非负的,那么你可以将它们相加并与0进行比较。如果可能是负数,你可以求它们的绝对值。

在您的示例中,列被视为字符串。如果它们实际上是CHAR或VARCHAR,则可以将它们全部连接起来并检查结果为空。你可能不得不将空值合并为''。

但这听起来像你真正想要的是在没有事先知道列的集合的情况下工作的东西;这在SQL中是不可行的。我想你可以在调用程序中编写一个函数/方法/过程,根据检查目录中的表列来生成查询。

相关问题