Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 从X删除,其中IN(..)不是删除行_Mysql - Fatal编程技术网

Mysql 从X删除,其中IN(..)不是删除行

Mysql 从X删除,其中IN(..)不是删除行,mysql,Mysql,我有一个问题,我用一堆不同的值过滤一个表。这个表上大约有30个不同的过滤器,因为我还是MySQL的新手,所以我在一个存储过程中执行多个DELETE查询来过滤。这个示例只显示我遇到问题的过滤器,它是一个DELETE from table WHERE value IN()query 下面是一个测试片段: CREATE TABLE accounts ( user_id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(40) NOT NULL,

我有一个问题,我用一堆不同的值过滤一个表。这个表上大约有30个不同的过滤器,因为我还是MySQL的新手,所以我在一个
存储过程中执行多个
DELETE
查询来过滤。这个示例只显示我遇到问题的过滤器,它是一个
DELETE from table WHERE value IN()
query

下面是一个测试片段:

CREATE TABLE accounts (
    user_id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(40) NOT NULL,
    PRIMARY KEY(user_id)
);

CREATE TABLE blocked (
    user_id INT(11) NOT NULL,
    other_id INT(11) NOT NULL,
);

INSERT INTO accounts (name) VALUES ('Chris'), ('Andy');
INSERT INTO blocked  (user_id, other_id) VALUES (1, 2);
查询创建两个表:accounts表包含两行,blocked表包含一行,其中
user\u id
1已阻止
user\u id
2

下面是给我们带来一些问题的查询(请注意,查询实际上比显示的更复杂,但是删除查询是100%相同的,并且通过提供的测试示例,问题仍然存在):

此查询应删除
user\u id
字段为2的行,因为在被阻止的表中,唯一的行是
(1,2)

直接运行提供用户\u id的SELECT查询将返回另一个\u id 2

SELECT other_id FROM blocked WHERE blocked.other_id = 2;
但是,存储过程返回两行,而不是一行。为什么?


注意:上面的查询是为了显示当查询
从阻止的位置选择其他\u id时返回的内容。user\u id=user\u in
,另一个示例是
从阻止的位置选择其他\u id。user\u id=1
已授予的
用户\u in
设置为1。这两个查询都将返回一组
(2)
,这将使删除查询看起来像
delete FROM filtered WHERE user_id IN(2)
。不管出于什么原因,这是行不通的

这句话的问题在于:

DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.other_id = user_id);
尝试将其更改为:

DELETE FROM filtered WHERE user_id 
IN (SELECT other_id FROM blocked);

原因是
blocked
表既有
other\u id
又有
user\u id
列。因此,当您试图加入到
过滤的
表中时,实际上您只是在比较
阻塞的
表中的
其他id
用户id
列。这是不平等的。因此不会发生删除。

这里的问题在于此语句:

DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.other_id = user_id);
尝试将其更改为:

DELETE FROM filtered WHERE user_id 
IN (SELECT other_id FROM blocked);

原因是
blocked
表既有
other\u id
又有
user\u id
列。因此,当您试图加入到
过滤的
表中时,实际上您只是在比较
阻塞的
表中的
其他id
用户id
列。这是不平等的。因此不会发生删除。

这里的问题在于此语句:

DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.other_id = user_id);
尝试将其更改为:

DELETE FROM filtered WHERE user_id 
IN (SELECT other_id FROM blocked);

原因是
blocked
表既有
other\u id
又有
user\u id
列。因此,当您试图加入到
过滤的
表中时,实际上您只是在比较
阻塞的
表中的
其他id
用户id
列。这是不平等的。因此不会发生删除。

这里的问题在于此语句:

DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.other_id = user_id);
尝试将其更改为:

DELETE FROM filtered WHERE user_id 
IN (SELECT other_id FROM blocked);

原因是
blocked
表既有
other\u id
又有
user\u id
列。因此,当您试图加入到
过滤的
表中时,实际上您只是在比较
阻塞的
表中的
其他id
用户id
列。这是不平等的。因此,不会发生删除操作。

要获得用户使用下一个查询的简单选择

SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked)
要在不从临时表中删除行的情况下使用单个select执行此操作,请使用下一个查询:

BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS filtered AS (SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked));
    SELECT * from filtered;
END
不需要先在临时表中全选,然后删除特定行

希望能有帮助

编辑:

我读了这个问题,对你的问题还是有点困惑。但我检查了这个解决方案,它工作得很好,所以我不明白这有什么问题。在你的程序中你有

DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.user_id = user_in);
然后你就这么说了

SELECT other_id FROM blocked WHERE blocked.other_id = 2;
我可以说,
blocked.other\u id
blocked.user\u id
是两个不同的列


没有不敬,只是业余爱好者弄错了栏目。:)

要获得用户使用下一个查询的简单选择

SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked)
要在不从临时表中删除行的情况下使用单个select执行此操作,请使用下一个查询:

BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS filtered AS (SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked));
    SELECT * from filtered;
END
不需要先在临时表中全选,然后删除特定行

希望能有帮助

编辑:

我读了这个问题,对你的问题还是有点困惑。但我检查了这个解决方案,它工作得很好,所以我不明白这有什么问题。在你的程序中你有

DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.user_id = user_in);
然后你就这么说了

SELECT other_id FROM blocked WHERE blocked.other_id = 2;
我可以说,
blocked.other\u id
blocked.user\u id
是两个不同的列


没有不敬,只是业余爱好者弄错了栏目。:)

要获得用户使用下一个查询的简单选择

SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked)
要在不从临时表中删除行的情况下使用单个select执行此操作,请使用下一个查询:

BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS filtered AS (SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked));
    SELECT * from filtered;
END
不需要先在临时表中全选,然后删除特定行

希望能有帮助

编辑:

我读了这个问题,对你的问题还是有点困惑。但我检查了这个解决方案,它工作得很好,所以我不明白这有什么问题。在你的程序中你有

DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.user_id = user_in);
然后你就这么说了

SELECT other_id FROM blocked WHERE blocked.other_id = 2;
我可以说,
blocked.other\u id
blocked.user\u id
是两个不同的列


没有不敬,只是业余爱好者弄错了栏目。:)

要获得用户使用下一个查询的简单选择

SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked)
要在不从临时表中删除行的情况下使用单个select执行此操作,请使用下一个查询:

BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS filtered AS (SELECT * FROM accounts WHERE accounts.user_id NOT IN (SELECT distinct blocked.other_id from blocked));
    SELECT * from filtered;
END
不需要先在临时表中全选,然后删除特定行

希望能有帮助

编辑:

我读了这个问题,对你的问题还是有点困惑。但我检查了这个解决方案,它工作得很好,所以我