SELECT 和 INNER JOIN 里面的 WHERE IN ()
SELECT and INNER JOIN inside WHERE IN ()
我需要做这样的事情
DELETE FROM order
WHERE id IN ( SELECT order.id
FROM db.order
INNER JOIN db.product ON product.id = order.product_id
WHERE product.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR)) LIMIT 10000);
然而那是行不通的。有什么办法可以做到这一点,或者有不同的方法吗?我确实需要删除超过 6 年的数据,所以如果有其他方法我很乐意尝试。
要使用 JOINS 进行删除,您可以使用别名来定位 table 应该进行删除的位置。我想你可以在文档中找到,但语法是:
DELETE o FROM
order AS o
JOIN
product AS p ON
product.id = order.product_id
AND product.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR))
这只会删除订单中的记录-table。
文档:https://dev.mysql.com/doc/refman/8.0/en/delete.html
寻找“多Table删除”
虽然不确定您要对 10000 的限制做什么,但正如 Lelio Faieta 所建议的那样,您可以为此使用子查询:
DELETE o FROM
order AS o
JOIN
(SELECT o.id
FROM order
JOIN
product AS p ON
product.id = order.product_id
AND product.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR))
LIMIT 10000
) AS s ON s.id = o.id
MySql 不支持 LIMIT
用于 multi-table DELETE
语句,因此您可以做的是在子查询中应用限制,然后加入 order
:
DELETE o
FROM `order` o
INNER JOIN (
SELECT o.id FROM `order` o INNER JOIN product p
ON p.product_id = o.id
WHERE p.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR))
LIMIT 10000
) t ON t.id = o.id;
我需要做这样的事情
DELETE FROM order
WHERE id IN ( SELECT order.id
FROM db.order
INNER JOIN db.product ON product.id = order.product_id
WHERE product.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR)) LIMIT 10000);
然而那是行不通的。有什么办法可以做到这一点,或者有不同的方法吗?我确实需要删除超过 6 年的数据,所以如果有其他方法我很乐意尝试。
要使用 JOINS 进行删除,您可以使用别名来定位 table 应该进行删除的位置。我想你可以在文档中找到,但语法是:
DELETE o FROM
order AS o
JOIN
product AS p ON
product.id = order.product_id
AND product.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR))
这只会删除订单中的记录-table。
文档:https://dev.mysql.com/doc/refman/8.0/en/delete.html
寻找“多Table删除”
虽然不确定您要对 10000 的限制做什么,但正如 Lelio Faieta 所建议的那样,您可以为此使用子查询:
DELETE o FROM
order AS o
JOIN
(SELECT o.id
FROM order
JOIN
product AS p ON
product.id = order.product_id
AND product.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR))
LIMIT 10000
) AS s ON s.id = o.id
MySql 不支持 LIMIT
用于 multi-table DELETE
语句,因此您可以做的是在子查询中应用限制,然后加入 order
:
DELETE o
FROM `order` o
INNER JOIN (
SELECT o.id FROM `order` o INNER JOIN product p
ON p.product_id = o.id
WHERE p.date < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 6 YEAR))
LIMIT 10000
) t ON t.id = o.id;