我正在使用MySQL,而且我目前有一个如下所示的数据表:
+---------+-----------------+-------------------+-----------+
| user_id | email | password | is_active |
+---------+-----------------+-------------------+-----------+
| 1 | admin@admin.com | [hashed_password] | 0 |
+---------+-----------------+-------------------+-----------+
| 2 | user@user.com | [hashed_password] | 0 |
+---------+-----------------+-------------------+-----------+
user_id
是主要的,唯一的,自动递增的字段,email
是唯一字段。
我想允许用户更新他们的电子邮件地址和密码,我遇到的问题是构造我的SELECT语句以验证所需的email
是否尚未使用以及是否已在使用然后使用,确保user_id
匹配。
例如,如果user_id
#2的人决定提交以下值:
Values:
+---------+-----------------+--------------------+-----------+
| user_id | email | password | is_active |
+---------+-----------------+--------------------+-----------+
| 2 | admin@admin.com | new value | 0 |
+---------+-----------------+--------------------+-----------+
结果应返回False
,因为admin@admin.com
#1存在user_id
,user_id
的值为2
Values:
+---------+-----------------+--------------------+-----------+
| user_id | email | password | is_active |
+---------+-----------------+--------------------+-----------+
| 2 | user@user.com | new value | 0 |
+---------+-----------------+--------------------+-----------+
结果应返回True
,因为即使{1}}存在user_id#2,user@user.com
的值也与电子邮件已属于的值相匹配
我尝试了以下代码,并在上面的示例中返回了#2中的值,但在#1中它根本没有返回值:
user_id
答案 0 :(得分:0)
Select email, user_id, if(user_id = 2, 1, 0) as owner from user where email ="admin@admin.com"
如果当前用户(Id 2)拥有已检查的电子邮件列所有者将返回1,否则为0
但如果你真的想通过查询来检查它(这不是个好主意)......
Select
If(u2.email is null or u1.user_id = u2.user_id, 1, 0) as result
From user u1
Left join user u2 on (u2.email = "admin@admin.com" )
Where u1.user_id = 2
因此您需要查询电子邮件和用户ID。 注意:我没有测试查询,因此可能存在错误。它只是方法的例子
答案 1 :(得分:0)
您不需要先检查。只是尝试执行UPDATE
。如果电子邮件在另一行中使用,由于email
列上的唯一索引,这将失败。您可以测试该错误并报告该电子邮件正在使用中。
如果您按自己的方式执行操作,则需要在SELECT
和UPDATE
查询之间使用交易,否则有人可能会在它们之间插入并使用所需的电子邮件创建一行。