1

有没有办法让 MySQL 告诉在一个充满子查询的巨大自动生成查询中哪个子查询给出了上述错误?如果没有,您的调试策略是什么?

4

2 回答 2

1

示例查询:

UPDATE direct_orders do
SET do.dealer_id = (
    SELECT d.dealer_id FROM dealers d
    INNER JOIN dealer_addresses da 
        ON da.dealer_id = d.dealer_id
        AND da.type =  'M'
        AND da.status = 1
    INNER JOIN dealer_details dd 
        ON dd.dealer_id = d.dealer_id
        AND dd.status = 1
    WHERE ( da.address1 LIKE CONCAT(  '%', do.address1,  '%' ) AND do.postal LIKE da.postal_code ) 
    OR dd.name LIKE CONCAT(  '%', do.company,  '%' ) 
    AND do.dealer_id = 0
)

此查询失败,原因与发帖人相同。正确测试这一点的一种方法是执行以下操作(注意以前依赖于子相关的表的 LEFT JOIN):

SELECT d.dealer_id FROM dealers d 
LEFT JOIN direct_orders do
    ON do.dealer_id = 0
INNER JOIN dealer_addresses da 
    ON da.dealer_id = d.dealer_id
    AND da.type =  'M'
    AND da.status = 1
INNER JOIN dealer_details dd 
    ON dd.dealer_id = d.dealer_id
    AND dd.status = 1
WHERE (da.address1 LIKE CONCAT(  '%', do.address1,  '%' ) AND do.postal LIKE da.postal_code ) 
OR dd.name LIKE CONCAT(  '%', do.company,  '%' )        

这样做表明实际上“direct_orders”表中的一条记录从“dealers”表中返回了多个“dealer_id”。

于 2014-03-11T21:10:36.827 回答
1

我将从在查询和可能的子查询上使用 LIMIT 或 DISTINCT 开始。如果这不起作用,我将开始单独运行每个子查询,是的,这很耗时,但我发现它也有助于避免将来出现同样的问题。

于 2012-09-11T15:24:12.717 回答