Mysql 如何修复使用join时的歧义
我试图对代码的不同部分进行别名,但无论我做什么,仍然会出现错误 from子句中的“product_id”列不明确 在我添加这部分代码后,错误将变为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
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