0

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内部クエリdateの一部を に置き換えてみましたが、別のエラーがスローされるだけです...AS dateinner_dateUnknown column 'inner_date' in 'where clause'

4

1 に答える 1

4

expirationという名前の列を持つテーブルを、それ自体が (式からの) という名前dateの列を持つマテリアライズド テーブルに結合しています。参照するテーブルのエイリアスを使用して、節での使用を修飾する必要があります。CASEdatedateWHERE

また:

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

または:

WHERE (
(
e.date >=  '2012-10-16'
AND e.valid=1
)
于 2012-10-15T17:30:05.603 に答える