我正在尝试创建代码,以便在更新 1 个或多个源表时更新表(从 2 个联接创建)。
这是原始代码:
REPLACE INTO operations (
customerId,
customerCreated
_Id
paymentsCreated
status,
amounts,
commerceName)
SELECT
cu.customerId,
cu.customerCreated
p._Id
p.paymentsCreated
p.status,
p.amounts,
c.commerceName)
FROM
payments p
LEFT JOIN
commerces c ON c._id = p.commerceId
LEFT JOIN
customers cu ON cu.customerId = p.customerId
如您所见,有 3 个表,每个表都可以通过修改很久以前创建的记录来随时更改。
嗯,我正在尝试使用这段代码,但我不知道它是否是最好的选择,并且它是最快的,因为表有数百万条记录。
REPLACE INTO operations (
customerId,
customerCreated,
_Id,
paymentsCreated,
status,
amounts,
commerceName
)
SELECT
cu.customerId,
cu.customerCreated,
p._Id,
p.paymentsCreated,
p.status,
p.amounts,
c.commerceName
FROM
payments p
LEFT JOIN
commerces c ON c._id = p.commerceId
LEFT JOIN
customers cu ON cu.customerId = p.customerId
WHERE
cu.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) OR
p.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) OR
c.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY);
假设您在
updated
列上有索引,将您的选择拆分为三个单独的选择,然后将它们与 UNION 组合可能会效果更好。
SELECT cu.customerId, cu.customerCreated, p._Id, p.paymentsCreated, p.status, p.amounts, c.commerceName
FROM payments p
LEFT JOIN commerces c ON c._id = p.commerceId
LEFT JOIN customers cu ON cu.customerId = p.customerId
WHERE p.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)
UNION
SELECT cu.customerId, cu.customerCreated, p._Id, p.paymentsCreated, p.status, p.amounts, c.commerceName
FROM payments p
INNER JOIN commerces c ON c._id = p.commerceId
LEFT JOIN customers cu ON cu.customerId = p.customerId
WHERE c.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)
UNION
SELECT cu.customerId, cu.customerCreated, p._Id, p.paymentsCreated, p.status, p.amounts, c.commerceName
FROM payments p
LEFT JOIN commerces c ON c._id = p.commerceId
INNER JOIN customers cu ON cu.customerId = p.customerId
WHERE cu.updated >= DATE_SUB(CURDATE(), INTERVAL 1 DAY);