我有一個問題,我正在過濾一堆不同的值。這張桌子上有大約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