SQL优化查询

时间:2013-12-04 23:39:03

标签: php mysql

我有一张包含以下记录的表:

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

是否有更简洁的方法来达到同样的效果?

3 个答案:

答案 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