2012-09-06 163 views
1

我想设置一个图像作为相册的封面,我通过从do-while循环中的无线电输入中选择它来完成。我在图像表中放置了一个名为is_cover的字段,如果图像设置为封面,则该字段取1;否则取0。MySQL高级更新查询

<input type="radio" name="cover" value="<?php echo $row_images['image_id']; ?>" <?php if($row_images['is_cover'] == 1){ echo "checked=\"checked\""; } ?> /> 

我的问题是如何执行,设置is_cover字段设置为0,只选择了图像获取的值的所有图像的更新查询1.

什么,我想说的是,我怎么能实现这一点:

$is_cover = $_POST['cover']; 
$query = " 
    UPDATE images 
    SET is_cover = 1 
    WHERE image_id = {$is_cover} 
      AND SET is_cover = 0 
    WHERE image_id <> {$is_cover} 
"; 

回答

5

一个这应该为你做的伎俩:

UPDATE images SET is_cover = CASE WHEN image_id = {$is_cover} THEN 1 ELSE 0 END; 

从我的测试:

mysql> select * from first; 
+------+-------+ 
| id | title | 
+------+-------+ 
| 1 | aaaa | 
| 2 | bbbb | 
| 3 | cccc | 
| 4 | NULL | 
| 6 | ffff | 
+------+-------+ 
5 rows in set (0.01 sec) 

mysql> update first set title = case when id > 4 then 'gggg' else title end; 
Query OK, 1 row affected (0.01 sec) 
Rows matched: 5 Changed: 1 Warnings: 0 

mysql> select * from first; 
+------+-------+ 
| id | title | 
+------+-------+ 
| 1 | aaaa | 
| 2 | bbbb | 
| 3 | cccc | 
| 4 | NULL | 
| 6 | gggg | 
+------+-------+ 
5 rows in set (0.00 sec) 
+0

谢谢!我已经测试过它,它似乎起作用! – Lykos

+0

很酷的解决方案。我不知道该怎么做。这对两个查询有什么好处?数据的完整性?效率? –

+1

@AndyGroff这是一个单一的查询,在这种情况下,对两个简单的查询来说不是一个巨大的好处,但是你可以用case语句做更多的事情。 – Fluffeh

0

你可以在这里运行2个查询一个将它们全部设置为0,然后设置你选择1

0

执行这两个疑问:

$query = "UPDATE images SET is_cover = 0 WHERE image_id <> {$is_cover}"; 

$query = "UPDATE images SET is_cover = 1 WHERE image_id = {$is_cover}"; 

第一个查询将所有is_cover为零。第二个查询为所选图像设置is_cover为1。