【问题标题】:Why does using an alias inside a "JOIN (SELECT)" statement result in an error?为什么在“JOIN (SELECT)”语句中使用别名会导致错误?
【发布时间】:2012-10-15 17:25:26
【问题描述】:

我使用的是 MySQL 5.5.16

我有以下查询,它本身就可以正常工作。

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 替换内部查询的AS date 部分中的date,但这只会引发另一个错误Unknown column 'inner_date' in 'where clause'...

【问题讨论】:

  • 您的查询不知道date 字段来自哪个表,您需要使用正确的别名对其进行限定。

标签: mysql mysql-error-1054 mysql-error-1052 mysql-5.5


【解决方案1】:

您正在将具有名为date 的列的expiration 表连接到本身具有名为date 的列(来自CASE 表达式)的具体化表。您应该使用您打算引用的任何表的别名来限定 WHERE 子句中 date 的使用。

要么:

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

或者:

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

【讨论】:

  • 天哪...该喝点咖啡了!谢谢!
猜你喜欢
  • 2015-05-15
  • 2015-06-12
  • 2016-03-30
  • 2015-08-02
  • 2012-02-13
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多