2012-10-15 22 views
0

我正在使用MySQL 5.5.16为什么在“JOIN(SELECT)”语句中使用别名会导致错误?

我有以下查询,它本身工作得很好。

SELECT DISTINCT i.id, 
CASE WHEN e.date > '2012-10-16' 
THEN e.date 
ELSE '9999-99-99' 
END AS date, 
CASE WHEN e.date > '2012-10-16' 
THEN time 
ELSE '99-99-99' 
END AS time 
FROM items AS i 
LEFT JOIN expiration AS e ON (e.item_id = i.id) 
WHERE (
(
data >= '2012-10-16' 
AND e.valid=1 
) 
OR i.never_expires=1 
) 
AND i.valid=1 
ORDER BY date ASC , time ASC 
LIMIT 0 , 10 

然而,当我将其包含在一个大的查询,我得到一个错误Column 'date' in where clause is ambiguous。下面是一个例子,其中上面的查询里面有个JOIN

SELECT i.id, i.title, i.never_expires, 
CASE WHEN e.date> '2012-10-16' 
THEN e.date 
ELSE '9999-99-99' 
END AS date, 
CASE WHEN e.date > '2012-10-16' 
THEN e.time 
ELSE '99-99-99' 
END AS time, i.item_price AS price 
FROM items AS i 
LEFT JOIN expiration AS e ON (e.item_id = i.id) 
JOIN (
    SELECT DISTINCT i.id, 
    CASE WHEN e.date > '2012-10-16' 
    THEN e.date 
    ELSE '9999-99-99' 
    END AS date, 
    CASE WHEN e.date > '2012-10-16' 
    THEN time 
    ELSE '99-99-99' 
    END AS time 
    FROM items AS i 
    LEFT JOIN expiration AS e ON (e.item_id = i.id) 
    WHERE (
    (
    data>= '2012-10-16' 
    AND e.valid=1 
) 
    OR i.never_expires=1 
) 
    AND i.valid=1 
    ORDER BY date ASC , time ASC 
    LIMIT 0 , 10 
) AS ilist ON (i.id=ilist.id) 
WHERE (
(
date >= '2012-10-16' 
AND e.valid=1 
) 
OR i.never_expires=1 
) 
AND i.valid=1 
ORDER BY dateASC , time ASC 

为什么声称date是模糊的?

PS 我已经试过了inner_date更换date在内部查询的AS date一部分,但只是抛出另一个错误Unknown column 'inner_date' in 'where clause' ...

+1

您的查询不知道是什么表了'date'场是从哪里来的,你需要用正确的别名限定它。 – Taryn

回答

4

您加入expiration表,其中有一个名为列date,物化表本身有一列(来自CASE表达式),名为date。您应该在您的WHERE子句中使用date,并使用您打算引用的任何表的别名。

或者:

WHERE (
(
ilist.date >= '2012-10-16' 
AND e.valid=1 
) 

或者:

WHERE (
(
e.date >= '2012-10-16' 
AND e.valid=1 
) 
+1

哦,上帝......时间多喝咖啡!谢谢! –

相关问题