我有一张包含以下记录的表:
ID | Username | Selected |
----------------------------
1 | JamesC | 1 |
2 | MikeF | 0 |
3 | JamesC | 0 |
我希望只有1行用户名相同,才能选择true。例如,当我将ID = 3
设置为Selected = true
时,我希望将ID =1
设置为Selected = false
以及具有相同用户名的任何其他ID。
现在我正在这样做,
//set all to 0
update table set selected = 0 where username = '$username'
//set unique row to true
update table set selected = 1 where username = '$username' and ID = '$ID';
是否有更简洁的方法来达到同样的效果?
答案 0 :(得分:2)
正如所说 - 不是很好的数据库结构,最好让表格具有唯一的名称和所选项目的ID,无论如何,你可以使用这个单一查询:
update table set selected=IF(id = '$ID', 1, 0) where username = '$username';
另外,尝试一种可能更快的变体(通过解释测试):
update table set selected=IF(id <> '$ID', 0, 1) where username = '$username';
答案 1 :(得分:1)
它看起来更像是为我优化数据库结构。有关具体答案需要更多信息,但请查看此示例以查看我在说什么:
用户:
user_id | user_name | selected_character_id | ...other account data
1 | JamesC | 3
2 | MikeF | 2
字符:
character_id | user_id | ...other character data
1 | 1 |
2 | 2 |
3 | 1 |
您需要JOIN
个表来检索所选字符的所有数据(快速,因为它对唯一ID进行操作),但摆脱数据重复(并且更容易切换)。
答案 2 :(得分:0)
您将始终需要第二个语句,但由于您只能使用一个“已选择”行:
update table set selected = 0 where selected = 1