[英]Apply mysql limit based on IN condition
我有一個更新查詢,該查詢根據where條件將col1
更新並將其限制為25。是否可以將以下查詢組合在一起,但是限制適用於indinvidyula IN
條件,而不是整個查詢
UPDATE myTable SET col1 = 'ABC' WHERE col2 = 'foo' LIMIT 25
UPDATE myTable SET col1 = 'ABC' WHERE col2 = 'bar' LIMIT 25
UPDATE myTable SET col1 = 'ABC' WHERE col2 = 'abc' LIMIT 25
UPDATE myTable SET col1 = 'ABC' WHERE col2 = '123' LIMIT 25
UPDATE myTable SET col1 = 'ABC' WHERE col2 = '12a' LIMIT 25
UPDATE myTable SET col1 = 'ABC' WHERE col2 = 'bbv' LIMIT 25
示例:我知道以下方法不會達到預期的效果。 但是我想對每個條件中的每個條件實施以下查詢limit
UPDATE myTable SET col1 = 'ABC' WHERE col2 IN('foo','bar','abc','123','12a','bbv') LIMIT 25
您只需按ID選擇前25行,然后使用這些ID更新回數據庫即可。
完全未經測試的代碼:
update table set col1 = '' where id in (select id from table WHERE col2 IN('foo','bar','abc','123','12a','bbv') LIMIT 25)
除非名單很長,否則我很想將UNION用於此類事情...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,fruit VARCHAR(12) NOT NULL
,val VARCHAR(12) NOT NULL
);
INSERT INTO my_table (fruit,val) VALUES
('orange','foo'),
('orange','foo'),
('orange','bar'),
('orange','foo'),
('orange','foo'),
('apple','bar'),
('apple','foo'),
('apple','bar'),
('apple','foo'),
('orange','foo'),
('apple','bar'),
('apple','bar');
SELECT * FROM my_table;
+----+--------+-----+
| id | fruit | val |
+----+--------+-----+
| 1 | orange | foo |
| 2 | orange | foo |
| 3 | orange | bar |
| 4 | orange | foo |
| 5 | orange | foo |
| 6 | apple | bar |
| 7 | apple | foo |
| 8 | apple | bar |
| 9 | apple | foo |
| 10 | orange | foo |
| 11 | apple | bar |
| 12 | apple | bar |
+----+--------+-----+
12 rows in set (0.24 sec)
SELECT *
FROM
( SELECT * FROM my_table WHERE fruit = 'orange' AND val = 'foo' ORDER BY id LIMIT 3 ) a
UNION
( SELECT * FROM my_table WHERE fruit = 'apple' AND val = 'bar' ORDER BY id LIMIT 3 );
+----+--------+-----+
| id | fruit | val |
+----+--------+-----+
| 1 | orange | foo |
| 2 | orange | foo |
| 4 | orange | foo |
| 6 | apple | bar |
| 8 | apple | bar |
| 11 | apple | bar |
+----+--------+-----+
6 rows in set (0.09 sec)
所以...
UPDATE my_table x
JOIN
( SELECT *
FROM
( SELECT * FROM my_table WHERE fruit = 'orange' AND val = 'foo' ORDER BY id LIMIT 3 ) a
UNION
( SELECT * FROM my_table WHERE fruit = 'apple' AND val = 'bar' ORDER BY id LIMIT 3 )
) y
ON y.id = x.id
SET x.val = 'abc';
Query OK, 6 rows affected (0.01 sec)
Rows matched: 6 Changed: 6 Warnings: 0
SELECT * FROM my_table;
+----+--------+-----+
| id | fruit | val |
+----+--------+-----+
| 1 | orange | abc |
| 2 | orange | abc |
| 3 | orange | bar |
| 4 | orange | abc |
| 5 | orange | foo |
| 6 | apple | abc |
| 7 | apple | foo |
| 8 | apple | abc |
| 9 | apple | foo |
| 10 | orange | foo |
| 11 | apple | abc |
| 12 | apple | bar |
+----+--------+-----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.