Mysql 从X删除,其中IN(..)不是删除行
我有一个问题,我用一堆不同的值过滤一个表。这个表上大约有30个不同的过滤器,因为我还是MySQL的新手,所以我在一个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,
存储过程中执行多个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
不需要先在临时表中全选,然后删除特定行
希望能有帮助
编辑:
我读了这个问题,对你的问题还是有点困惑。但我检查了这个解决方案,它工作得很好,所以我