Php 使用mysql获取空列的名称

Php 使用mysql获取空列的名称,php,mysql,Php,Mysql,我有一组图像路径存储在如下表中: +---------------------------------------------------------+ |ID |pimg0 |pimg1 |pimg2 | +-------------+-------------+--------------+--------------+ |1 |path/to/img0 |path/to/

我有一组图像路径存储在如下表中:

    +---------------------------------------------------------+
    |ID           |pimg0        |pimg1         |pimg2         |
    +-------------+-------------+--------------+--------------+
    |1            |path/to/img0 |path/to/img1  |              |
    +---------------------------+--------------+--------------+
    |2            |path/to/img0 |path/to/img1  |              |
    +---------------------------+--------------+--------------+
我想得到空字段的表名,这样我就可以在其中输入一个新条目

我尝试在mysql查询中嵌套IFNULL()命令,但没有成功:

    IFNULL(pimg0, IFNULL(pimg1, IFNULL(pimg2, IFNULL(pimg3, IFNULL(pimg4, IFNULL(pimg5))))))
我也试过一些不起作用的箱子。理想情况下,我希望我的查询在上述场景中返回“pimg2”,但如果它返回“pimg1”,我可以轻松地增加它


编辑:编辑上面的表格,以澄清。

虽然你可能可以用sql来做,但我个人会用php来做;只需获取整行并在字段中循环,直到找到一个空结果

SELECT id, 'pimg0'
FROM table WHERE pimg0 is null
UNION
SELECT id, 'pimg1'
FROM table WHERE pimg1 is null
UNION
SELECT id, 'pimg2'
FROM table WHERE pimg2 is null
这样,如果您决定在将来添加一些附加列,它将自动继续工作

IFNULL(concat('t0|',pimg0), IFNULL(concat('t1|',pimg1), IFNULL(concat('t2|',pimg2), IFNULL(concat('t3|',pimg3), IFNULL(concat('t4|',pimg4), IFNULL(concat('t5|',pimg5)))))))
然后使用“|”作为分隔符来获取值和列

添加

MySql可以直接为您提供值和列名

select 
IFNULL(pimg0, IFNULL(pimg1, IFNULL(pimg2, IFNULL(pimg3, IFNULL(pimg4, IFNULL(pimg5)))))) as value,    
SUBSTRING_INDEX( IFNULL(concat('t0|',pimg0), IFNULL(concat('t1|',pimg1), IFNULL(concat('t2|',pimg2), IFNULL(concat('t3|',pimg3), IFNULL(concat('t4|',pimg4), IFNULL(concat('t5|',pimg5))))))), '|',1) as columnname

我很喜欢上面Zohaib提供的MySQL答案,但如果您想按照jeroen的思路,用PHP实现这一点,您可能需要以下内容:

 $query = "SELECT * FROM table";
 $result = mysql_query or die();
 while($row = mysql_fetch_array($result))
 {
      foreach($row as $key => $val)
      {
           if(empty($val))
           {
                //DoStuff
                print "Empty $key in ID: {$row['id']}<br/>";
           }
      }
  }
$query=“从表中选择*”;
$result=mysql_query或die();
while($row=mysql\u fetch\u数组($result))
{
foreach($key=>$val的行)
{
如果(空($val))
{
//多斯塔夫
打印“ID:{$row['ID']}中的空$key
”; } } }
我想我拿到了

$sql="
   SELECT
   *
   FROM 
   table
   WHERE
   ID = $id
   ";

$query=mysql_query($sql)or die(mysql_error());
$array=mysql_fetch_assoc($query);

for($i=0; $i<=6; $i++){
   $imageentry = "pimg".$i;
   if($array[$imageentry]=='' or $array[$imageentry]=null){
   $nextimagenumber = $i;
   break;
}
}
echo $nextimagenumber;

返回“2”

您正经历的痛点之一,这违反了第一个正常形式

通过创建一个包含一列图像路径的子表,并在有多个图像时添加多行,如果进行规范化,痛苦就会消失

CREATE TABLE Images (
  image_id  INT AUTO_INCREMENT PRIMARY KEY,
  owner_id INT NOT NULL, -- references `id` in your original table
  pimg      VARCHAR(40)
);
INSERT INTO Images (owner_id, pimg) VALUES 
 (1, 'path/to/img0'), (1, 'path/to/img1'), 
 (2, 'path/to/img2'), (2, 'path/to/img3');
以这种方式构造数据库可以更轻松地执行许多任务:

  • 通过插入新行插入新图像;无需查找空白列。
  • 将第四个或第五个图像添加到给定的
    所有者id
  • 搜索给定图像并报告其所有者id
  • 按所有者id对图像进行计数
  • 避免重复

您的第二个WHERE子句中有一个拼写错误。我认为这应该只是一个语义问题,仅仅存储文件名而不是path/to/file/name.jpg会更容易吗?这样,如果需要更改文件结构,您就可以更新代码,而不必编辑数据库中每一行的数据。是的,我实际上在数据库中只有图像名称,在循环运行时,文件路径是用php编译的。而且。。你想得到一个空/空值的列名,对吗?然后,执行更新来填充它?该值是否基于列名?我想获取列名或定义列增量的值,因此在本例中,我希望返回“pimg2”或“2”,我将使用该信息进行sql更新。我认为您可能是对的,无论如何,php比mysql更容易使用。对不起,我误解了rquest。这太棒了,本可以防止我遇到这个问题。我解决了下面的问题,但这是一个更好的解决方法。
CREATE TABLE Images (
  image_id  INT AUTO_INCREMENT PRIMARY KEY,
  owner_id INT NOT NULL, -- references `id` in your original table
  pimg      VARCHAR(40)
);
INSERT INTO Images (owner_id, pimg) VALUES 
 (1, 'path/to/img0'), (1, 'path/to/img1'), 
 (2, 'path/to/img2'), (2, 'path/to/img3');