Php SQL优化查询

Php SQL优化查询,php,mysql,Php,Mysql,我有一个表,其中包含以下记录: ID | Username | Selected | ---------------------------- 1 | JamesC | 1 | 2 | MikeF | 0 | 3 | JamesC | 0 | 我希望仅为用户名相同的1行选择“为真”。因此,例如,当我将ID=3设置为Selected=true时,我希望设置ID=1使Selected=false以及

我有一个表,其中包含以下记录:

    ID | Username | Selected |
   ----------------------------
    1  |  JamesC  |     1    |
    2  |  MikeF   |     0    |
    3  |  JamesC  |     0    |
我希望仅为用户名相同的1行选择“为真”。因此,例如,当我将
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';

有没有更好更简洁的方法来达到同样的效果?

您总是需要第二个语句,但由于您只有一个“选定”行,因此可以使用:

update table set selected = 0 where selected = 1

您将始终需要第二条语句,但由于您只有一个“选定”行,因此可以使用:

update table set selected = 0 where selected = 1

您将始终需要第二条语句,但由于您只有一个“选定”行,因此可以使用:

update table set selected = 0 where selected = 1

您将始终需要第二条语句,但由于您只有一个“选定”行,因此可以使用:

update table set selected = 0 where selected = 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上运行,所以速度很快),但要消除数据重复(并且更容易切换)。

在我看来,这更像是优化数据库结构。具体答案需要更多信息,但请查看此示例以了解我所说的内容:

用户:

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上运行,所以速度很快),但要消除数据重复(并且更容易切换)。

在我看来,这更像是优化数据库结构。具体答案需要更多信息,但请查看此示例以了解我所说的内容:

用户:

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上运行,所以速度很快),但要消除数据重复(并且更容易切换)。

在我看来,这更像是优化数据库结构。具体答案需要更多信息,但请查看此示例以了解我所说的内容:

用户:

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上运行,所以速度很快),但要消除数据重复(并且更容易切换)。

正如所说的-不是很好的数据库结构,最好是具有唯一名称和所选项目ID的表,无论如何,您可以使用以下单个查询:

update table set selected=IF(id = '$ID', 1, 0) where username = '$username';
另外,尝试一种可能更快的变体(通过explain进行测试):

updatetableset selected=IF(id'$id',0,1),其中username='$username';

如前所述-不是很好的数据库结构,最好是有唯一名称和所选项目ID的表,无论如何,您可以使用以下单个查询:

update table set selected=IF(id = '$ID', 1, 0) where username = '$username';
另外,尝试一种可能更快的变体(通过explain进行测试):

updatetableset selected=IF(id'$id',0,1),其中username='$username';

如前所述-不是很好的数据库结构,最好是有唯一名称和所选项目ID的表,无论如何,您可以使用以下单个查询:

update table set selected=IF(id = '$ID', 1, 0) where username = '$username';
另外,尝试一种可能更快的变体(通过explain进行测试):

updatetableset selected=IF(id'$id',0,1),其中username='$username';

如前所述-不是很好的数据库结构,最好是有唯一名称和所选项目ID的表,无论如何,您可以使用以下单个查询:

update table set selected=IF(id = '$ID', 1, 0) where username = '$username';
另外,尝试一种可能更快的变体(通过explain进行测试):

updatetableset selected=IF(id'$id',0,1),其中username='$username';


您使用的是什么SQL数据库?请用它标记。@shiva抱歉,我正在使用mysqlother表来选择它们是什么?您使用的是什么SQL数据库?请用它标记。@shiva抱歉,我正在使用mysqlother表来选择它们是什么?您使用的是什么SQL数据库?请用它标记。@shiva抱歉,我正在使用mysqlother表来选择它们是什么?您使用的是什么SQL数据库?请用它标记。@shiva抱歉,我正在使用mysqlother表来选择它们是什么?OP询问“只有一行的用户名相同时为true”,这是OP的答案吗?那么你能为OP和我解释一下吗?你是对的,错过了“用户名相同的地方”。在我看来,OP也属于……OP是在问“只有一行用户名相同的情况下才是真的”,这是OP的答案吗?那么你能为OP和我解释一下吗?你是对的,错过了“用户名相同的地方”。在我看来,OP也属于……OP是在问“只有一行用户名相同的情况下才是真的”,这是OP的答案吗?那么你能为OP和我解释一下吗?你是对的,错过了“用户名相同的地方”。在我看来,OP也属于……OP是在问“只有一行用户名相同的情况下才是真的”,这是OP的答案吗?那么你能为OP和我解释一下吗?你是对的,错过了“用户名相同的地方”。在我看来,OP也属于……你能解释一下为什么这种结构不是最优的吗?是的,这不是BCNF,但这是否比执行联接来查找每行的选定值更好?@Edward what joins?只有一个带有用户名的表,对于每个用户名,只有一个带有selectedId的int字段,因此您可以只使用
updatetable set selected=$ID其中username=$username
您能解释一下为什么这种结构不是最佳的吗?是的,这不是BCNF,但这是否比执行联接来查找每行的选定值更好?@Edward what joins?只有一个带有用户名的表,对于每个用户名,只有一个带有selectedId的int字段,因此您可以只使用
updatetable set selected=$ID其中username=$username
您能解释一下为什么这种结构不是最佳的吗?是的,这不是BCNF,但这是否比执行联接来查找每行的选定值更好?@Edward what joins?只需使用用户名和