Mysql 如何修复使用join时的歧义

Mysql 如何修复使用join时的歧义,mysql,Mysql,我试图对代码的不同部分进行别名,但无论我做什么,仍然会出现错误 from子句中的“product_id”列不明确 在我添加这部分代码后,错误将变为 LEFT JOIN oc_product_special ps ON ps.product_id = filter_counter.product_id AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR

我试图对代码的不同部分进行别名,但无论我做什么,仍然会出现错误

from子句中的“product_id”列不明确

在我添加这部分代码后,错误将变为

LEFT JOIN oc_product_special ps ON ps.product_id = filter_counter.product_id AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))
最终代码:

SELECT options.option_id,
    COUNT(DISTINCT CASE WHEN filter_counter.option_id = options.option_id THEN product_id END) total
    FROM filter_counter
    
    LEFT JOIN oc_product USING (product_id)
    LEFT JOIN oc_product_special ps ON ps.product_id = sd.product_id AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))
    
    CROSS JOIN ( SELECT DISTINCT option_id FROM filter_counter ) AS options
    
    JOIN ( SELECT DISTINCT sd1.product_id FROM filter_counter sd1
        WHERE manufacturer_id  IN (21) ) AS filter43 USING (product_id) 
        
        
            WHERE (CASE WHEN ps.price IS NULL THEN p.price BETWEEN 10 AND 50 WHEN ps.price IS NOT NULL THEN ps.price BETWEEN 10 AND 50 END)
        GROUP BY options.option_id
我试着用ON和add Alias交换使用,但仍然是同一个错误,我不知道如何修复

SELECT options.option_id,
    COUNT(DISTINCT CASE WHEN sd.option_id = options.option_id THEN product_id END) total
    FROM filter_counter sd
    
    LEFT JOIN oc_product p ON p.product_id = sd.product_id
  LEFT JOIN oc_product_special ps ON ps.product_id = sd.product_id AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))
    
    CROSS JOIN ( SELECT DISTINCT option_id FROM filter_counter) AS options
      
    JOIN ( SELECT DISTINCT product_id FROM filter_counter
        WHERE manufacturer_id  IN (21) ) AS filter43 ON filter43.product_id = sd.product_id
        
            WHERE (CASE WHEN ps.price IS NULL THEN p.price BETWEEN 10 AND 50 WHEN ps.price IS NOT NULL THEN ps.price BETWEEN 10 AND 50 END)
        GROUP BY options.option_id
改变

您添加的oc\U product\U特殊联接使其不明确是ps.product\U id还是filter\U counter.product\U id。

更改:-

 COUNT(DISTINCT CASE WHEN filter_counter.option_id = options.option_id THEN product_id END) total
致:-


COUNTDISTINCT CASE WHEN filter\u counter.option\u id=options.option\u id然后filter\u counter.product\u id END product\u id

如果WHEN子句prodict\u id未完全限定,请尝试使用例如:sd.product\u id

SELECT options.option_id,
    COUNT(DISTINCT CASE WHEN sd.option_id = options.option_id THEN sd.product_id END) total
    FROM filter_counter sd

    LEFT JOIN oc_product p ON p.product_id = sd.product_id
    LEFT JOIN oc_product_special ps ON ps.product_id = sd.product_id 
        AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))

    CROSS JOIN ( SELECT DISTINCT option_id FROM filter_counter) AS options
  
    JOIN ( SELECT DISTINCT product_id 
            FROM filter_counter
            WHERE manufacturer_id  IN (21) 
    ) AS filter43 ON filter43.product_id = sd.product_id
    
    WHERE (CASE WHEN ps.price IS NULL THEN p.price BETWEEN 10 AND 50 WHEN ps.price IS NOT NULL THEN ps.price BETWEEN 10 AND 50 END)
    GROUP BY options.option_id

使用product_id仅对联接表折叠此列。如果以后联接的第三个表包含相同的列,则此列不会折叠为。此外,在使用x的左联接b中,列名x仅与a.x匹配。您只需要查询中所有表的别名。我建议不要使用USING@Ivan并非所有列都使用表名/alias.Check COUNTDISTINCT CASE限定,当sd.option\u id=options.option\u id然后product\u id结束时。
 COUNT(DISTINCT CASE WHEN filter_counter.option_id = options.option_id THEN product_id END) total
SELECT options.option_id,
    COUNT(DISTINCT CASE WHEN sd.option_id = options.option_id THEN sd.product_id END) total
    FROM filter_counter sd

    LEFT JOIN oc_product p ON p.product_id = sd.product_id
    LEFT JOIN oc_product_special ps ON ps.product_id = sd.product_id 
        AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))

    CROSS JOIN ( SELECT DISTINCT option_id FROM filter_counter) AS options
  
    JOIN ( SELECT DISTINCT product_id 
            FROM filter_counter
            WHERE manufacturer_id  IN (21) 
    ) AS filter43 ON filter43.product_id = sd.product_id
    
    WHERE (CASE WHEN ps.price IS NULL THEN p.price BETWEEN 10 AND 50 WHEN ps.price IS NOT NULL THEN ps.price BETWEEN 10 AND 50 END)
    GROUP BY options.option_id