Mysql 我不明白为什么这两个带WHERE IN的SQL查询会给出不同的结果
我想做什么 :仅当存在满足WHERE条件的数据时才删除行 表如下所示,我使用的是MySQLMysql 我不明白为什么这两个带WHERE IN的SQL查询会给出不同的结果,mysql,Mysql,我想做什么 :仅当存在满足WHERE条件的数据时才删除行 表如下所示,我使用的是MySQL table A +-----------+-------------+---------------------+ | id | user_id | created_date | +-----------+-------------+---------------------+ | 17 | Amy | 2021-04-19 17:00:0
table A
+-----------+-------------+---------------------+
| id | user_id | created_date |
+-----------+-------------+---------------------+
| 17 | Amy | 2021-04-19 17:00:00 |
| 19 | Amy | 2021-04-20 17:00:00 |
| 20 | Amy | 2021-04-22 17:00:00 |
| 21 | Bob | 2021-04-22 17:00:00 |
+-----------+-------------+---------------------+
第一次尝试
我尝试了下面的查询,但失败了。
我只想删除艾米的2021-04-20数据,但它删除了艾米的所有三行
删除
用户标识在哪里
从中选择tmp.user\u id,其中datecreated\u date=date2021-04-20和user\u id=Amy tmp
用户_id=Amy;
第二次尝试
成功。
下面的查询仅删除符合条件的一行
删除
创建日期在哪里
从中选择tmp.created_date从中选择created_date,其中datecreated_date=date2021-04-20和user_id=Amy tmp
用户_id=Amy;
问题
我不明白为什么这两个SQL查询会给出不同的结果。
我所改变的只是使用了另一个专栏。
也许我没有完全理解IN或subquery:
请给出一些建议。了解MySQL语句的执行顺序可能有助于您理解这种情况 FROM子句 WHERE子句 SELECT子句 分组依据子句 有从句 按条款订货 因此,在本例中,查询的解释从原始表开始。但是,where条件中的主查询有另一个查询,该查询也开始按该顺序进行计算。在第一种情况下,子查询WHERE语句中的条件是:
SELECT tmp.user_id from (SELECT user_id FROM example WHERE date(created_date)=date("2021-04-20") AND user_id="Amy") tmp;
该查询的结果是“Amy”。因为即使使用createddate进行计算,您也在SELECT语句中请求用户id
在第二种情况下:
SELECT tmp.created_date from (SELECT created_date FROM example WHERE date(created_date)=date("2021-04-20") AND user_id="Amy") tmp
结果是“2021-04-20 17:00:00”,这是一个结果,在搜索过程中,您将有效地消除一条记录
继续执行顺序,我们已经注意到,在这两种情况下,数据范围都会发生变化,因为您正在使用WHERE user_id in或WHERE created_date in更改主查询中的搜索条件
在第一种情况下,它会查找用户id为“Amy”的所有内容,在第二种情况下,它会查找日期为“2021-04-20 17:00:00”的所有内容
仅从理论上讲,如果我们想要解决第一种情况,您还应该在主查询中包含日期字段的条件,该字段可以区分“Amy”的3种情况。其内容如下:
SELECT * FROM example
WHERE user_id IN (
SELECT tmp.user_id from (SELECT user_id FROM example WHERE date(created_date)=date("2021-04-20") AND user_id="Amy") tmp )
and created_date IN (SELECT tmp.created_date from (SELECT created_date FROM example WHERE date(created_date)=date("2021-04-20") AND user_id="Amy") tmp)
注意。子选择返回一个或多个值。第一个是艾米。在第二个字段中,它返回一个日期。尝试选择子选择中的值,然后手动将该值放入外部选择中。我确信您会注意到这一差别:考虑SQL是否从艾米中的何处用户删除ID,鲍伯,而不是从DATE2021-04-22中创建的DATEDATY删除