#1054-“ where子句”中的未知列“ tt.date”

时间:2019-11-29 16:07:57

标签: mysql

我到处搜寻Google,并尝试了几个小时,我放弃了。。。我一生都找不到解决此问题的方法... #1054 - Unknown column 'bb.date' in 'where clause'。我当然需要访问bb.date,但是我无法访问嵌套的LEFT JOIN中的别名“ bb”,但是我需要访问它。如何将别名传递到该范围?

SELECT
    bb.date,
    PP.max_sell_price_asofdate,
    i.item_id,
    bb.transaction_id
FROM items_transactions bb

LEFT JOIN items_transactions_details t
    ON bb.transaction_id = t.transaction_id

LEFT JOIN items i
    ON i.item_id = t.item_id

LEFT JOIN (
    SELECT
        pp.item_id,
        MAX(pp.sell_price_asofdate) max_sell_price_asofdate
    FROM items_prices pp
    WHERE bb.date >= ss.sell_price_asofdate -- #1054 - Unknown column 'bb.date' in 'where clause'
    GROUP BY pp.item_id
) PP ON PP.item_id = i.item_id

如果我提供我想用这些表及其某些相关字段完成的更多详细信息,可能会更好。即使我可以访问bb别名,我的查询似乎也不正确。基本上我想做的就是加入所有下表,并确保每个交易项都获得正确的sell_price。因此,例如,对于具有购买日期为2019-11-29的item_id 148的交易611,应以正确的sell_price 13进行合并,因为表item_prices中item_id 148的最新价格历史记录的更改日期为2019-11-28,即sell_price 13.当前,它错误地合并了每个商品的所有价格

items_transactions

items_transactions

items_transactions_details

items_transactions_details

items_prices

items_prices

项目

items

2 个答案:

答案 0 :(得分:1)

您可以使用对外部表的引用,但不能使用与替代查询相同的from子句中的表。例如,您可以将代理查询移至SELECT子句:

SELECT
    bb.date,
    i.item_id,
    bb.transaction_id,
    (
    SELECT
        MAX(pp.sell_price_asofdate) max_sell_price_asofdate
    FROM items_prices pp
    WHERE 
          bb.date >= pp.sell_price_asofdate 
          and pp.item_id = i.item_id
    GROUP BY pp.item_id
    ) max_sell_price_asofdate

FROM items_transactions bb

LEFT JOIN items_transactions_details t
    ON bb.transaction_id = t.transaction_id

LEFT JOIN items i
    ON i.item_id = t.item_id

请注意,代理查询的性能不是很好。没有代理查询:

SELECT 
    A.date, A.item_id, A.transaction_id  ,
    MAX(B.sell_price_asofdate) as max_sell_price_asofdate
FROM
(
  SELECT
    bb.date,
    i.item_id,
    bb.transaction_id

  FROM items_transactions bb

  LEFT JOIN items_transactions_details t
    ON bb.transaction_id = t.transaction_id

  LEFT JOIN items i
    ON i.item_id = t.item_id
) A
LEFT OUTER JOIN
(
    SELECT
        pp.item_id,
        pp.sell_price_asofdate
    FROM items_prices pp
) B
ON 
   A.date >= B.sell_price_asofdate 
   and B.item_id = A.item_id
GROUP BY
    A.date, A.item_id, A.transaction_id  

答案 1 :(得分:0)

为显示Sell_price,可以使用:

     SELECT
        bb.date,
        i.item_id,
        bb.transaction_id,
        (
        SELECT 
            pp.sell_price
            FROM items_prices pp
            WHERE i.item_id = pp.item_id AND bb.date >= pp.sell_price_asofdate
            ORDER BY pp.sell_price_asofdate DESC, pp.row_id DESC
            LIMIT 1
        ) sell_price

    FROM items_transactions bb

    LEFT JOIN items_transactions_details t
        ON bb.transaction_id = t.transaction_id

    LEFT JOIN items i
        ON i.item_id = t.item_id