我有一组图像路径存储在这样的表中:
+---------------------------------------------------------+
|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”,我可以轻松地增加它。
编辑:编辑上表,澄清。
答案 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');
以这种方式构建数据库可以更轻松地完成许多任务:
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”