Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我不明白为什么这两个带WHERE IN的SQL查询会给出不同的结果_Mysql - Fatal编程技术网

Mysql 我不明白为什么这两个带WHERE IN的SQL查询会给出不同的结果

Mysql 我不明白为什么这两个带WHERE IN的SQL查询会给出不同的结果,mysql,Mysql,我想做什么 :仅当存在满足WHERE条件的数据时才删除行 表如下所示,我使用的是MySQL table A +-----------+-------------+---------------------+ | id | user_id | created_date | +-----------+-------------+---------------------+ | 17 | Amy | 2021-04-19 17:00:0

我想做什么 :仅当存在满足WHERE条件的数据时才删除行

表如下所示,我使用的是MySQL

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删除