我有一个问题,我正在过滤一堆不同的值。这张桌子上有大约30个不同的过滤器,因为我仍然是MySQL的新手,我在stored procedure
中执行了多个DELETE
查询,从临时表中进行过滤。这个例子只会显示我遇到问题的过滤器,这是一个DELETE FROM table WHERE value IN()
查询。DELETE FROM X WHERE IN(..)不删除行
这里的一个测试Schisma:
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);
的查询创建两个表:含有两行的帐目表,并含有一个行,其中user_id
1具有user_id
2阻止阻塞表。
这里是造成了我们一些问题的查询(请注意查询其实比显示的更复杂,但DELETE查询是100%相同,这个问题通过提供的测试例子仍然存在):
BEGIN
#user_in input is a int(11) value bassed in the CALL FUNCTION(ID).
CREATE TEMPORARY TABLE IF NOT EXISTS filtered AS (SELECT * FROM accounts);
DELETE FROM filtered WHERE user_id IN (SELECT other_id FROM blocked WHERE blocked.user_id = user_in);
SELECT * FROM filtered;
END
该查询应删除user_id
字段为2的行,如阻止表中唯一的行为(1, 2)
。
运行直接提供USER_ID SELECT查询返回,而不只是一个的2
SELECT other_id FROM blocked WHERE blocked.other_id = 2;
然而,存储过程返回两行中other_id。为什么?
注:以上查询是要表明什么时返回查询SELECT other_id FROM blocked WHERE blocked.user_id = user_in
,另一个例子是SELECT other_id FROM blocked WHERE blocked.user_id = 1
授予user_in
设置为1,这两个查询将返回一组的(2)
这将使删除查询的样子DELETE FROM filtered WHERE user_id IN (2)
。无论出于何种原因,这都行不通。
“我在存储过程中完成”...因为...? – Strawberry
@Strawberry'因为我仍然是MySQL的新手,所以我在存储过程中完成了这个工作,就像'这个表上有大约30个不同的过滤器一样',存储过程实际上略长于250行。 SELECT查询获得相同结果的复杂度远高于我的水平。 – Hobbyist
我想我不明白为什么你需要过滤表。 – Strawberry