使用mysql获取空列的名称

时间:2011-12-21 17:51:37

标签: php mysql

我有一组图像路径存储在这样的表中:

    +---------------------------------------------------------+
    |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”,我可以轻松地增加它。

编辑:编辑上表,澄清。

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您遇到了repeating groups across columns的一个痛点,这违反了First Normal Form。

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

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');

以这种方式构建数据库可以更轻松地完成许多任务:

  • 通过INSERT新行插入新图像;无需找到空白栏。
  • 将第四张或第五张图片添加到给定的owner_id
  • 搜索指定的图片并报告owner_id拥有该图片。
  • owner_id计算图像。
  • 避免重复。

答案 2 :(得分:0)

虽然你可以在sql中做到这一点,但我个人会在php中做到这一点;只需获取整行并遍历字段,直到找到空结果。

如果您决定在将来添加一些额外的列,它会自动继续工作。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我确实喜欢上面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/>";
           }
      }
  }

答案 5 :(得分:0)

我想我拥有它。

$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;

这会返回空的“pimg”字段的下一个数字,即使表中有间隙,所以在这样的表上运行它:

+---------------+---------------+---------------+
|pimg0          |pimg1          |pimg2          |
+---------------+---------------+---------------+
|img0           |               |img2           |
+---------------+---------------+---------------+

返回“2”