Команда UPDATE с использованием существующих данных - PullRequest
0 голосов
/ 02 июля 2018

Мне нужно обновить записи некоторых таблиц, и я попытался использовать следующую команду:

UPDATE auction a        
JOIN (SELECT bidding_price, user_id, auction_id FROM bid_account WHERE auction_id = a.auctionID ORDER BY bidpack_buy_date DESC LIMIT 1) ult_lance_a
SET a.auc_final_price=ult_lance_a.bidding_price, a.buy_user=ult_lance_a.user_id
WHERE a.auctionID=ult_lance_a.auction_id;

Однако я получаю следующую ошибку:

#1054 - Column 'a.auctionID' unknown in 'where clause'

что я сделал не так?

Вот ответ команды: SELECT bidding_price, user_id, auction_id FROM bid_account WHERE auction_id = XXX ORDER BY bidpack_buy_date DESC LIMIT 1

bidding_price = 6,23
user_id = 1720
auction_id = 1818

В таблице auction есть столбцы:

auc_final_price
bidding_price
auctionID

Есть несколько записей, но записи одинаковы для столбцов: auction_id и auctionID .

Мне нужно просто взять значение LAST, введенное в таблицу bid_account, и скопировать значения в таблицу auction.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Ваша основная проблема заключается в том, что вы пропускаете предложение «ON» в своем объединении и пытаетесь выполнить то же самое, используя предложение «WHERE» в своем подзапросе.

a.auctionID не существует в контексте подзапроса SELECT bidding_price, user_id, auction_id FROM bid_account WHERE auction_id = a.auctionID ..., поэтому выдает ошибку.

Попробуйте так, вместо этого:

UPDATE 
    auction AS a
INNER JOIN 
    /* Find the highest (max) bidpack_buy_date for each auction */
    (SELECT MAX(bidpack_buy_date) AS `Max Date`, auction_id FROM bid_account GROUP BY auction_id) AS maxdates
    ON 
    maxdates.auction_id = a.auctionID
INNER JOIN
    /* The data from bid_acount that accompanies the max dates found above */
    bid_account AS ult_lance_a
    ON
    ult_lance_a.bidpack_buy_date = maxdates.`Max Date`
    AND
    ult_lance_a.auction_id = maxdates.auction_ID
SET 
    a.auc_final_price = ult_lance_a.bidding_price,
    a.buy_user = ult_lance_a.user_id

Код, который я использовал для настройки теста:

DROP TABLE IF EXISTS bid_account;
CREATE TABLE IF NOT EXISTS bid_account (
    auction_id int,
    user_id int, 
    bidding_price numeric(8,2),
    bidpack_buy_date DATETIME
);

DROP TABLE IF EXISTS auction;
CREATE TABLE IF NOT EXISTS auction (
    auctionID int,
    buy_user int,
    auc_final_price numeric(8,2)
);

INSERT INTO 
    bid_account 
        (auction_id, user_id, bidding_price, bidpack_buy_date)
    VALUES
        (1,1, 10.00, '2017-01-01 12:00:01 PM'),
        (1,2, 20.00, '2017-01-01 12:00:02 PM'),
        (1,3, 30.00, '2017-01-01 12:00:03 PM'),
        (1,4, 40.00, '2017-01-01 12:00:04 PM'),
        (2,1, 10.00, '2017-01-01 12:00:01 PM'),
        (2,2, 20.00, '2017-01-01 12:00:02 PM'),
        (2,3, 30.00, '2017-01-01 12:00:03 PM');

INSERT INTO 
    auction 
        (auctionID)
    VALUES
        (1),
        (2),
        (3),
        (4),
        (5),
        (6),
        (7);        
0 голосов
/ 02 июля 2018

Вероятно, есть лучший способ сформулировать свое обновление, но если вы хотите использовать коррелированные подзапросы, то вам может потребоваться поместить их непосредственно в предложение SET:

UPDATE auction a
SET auc_final_price = (SELECT bidding_price
                       FROM bid_account
                       WHERE auction_id = a.auctionID
                       ORDER BY bidpack_buy_date DESC
                       LIMIT 1),
    buy_user = (SELECT user_id
                FROM bid_account
                WHERE auction_id = a.auctionID
                ORDER BY bidpack_buy_date DESC
                LIMIT 1);

На самом деле, я думаю, что мы все еще можем написать ваш запрос, используя синтаксис объединения обновлений. Поскольку ваши таблицы большие, вы можете попробовать объединиться с временной таблицей (вместо материализованного представления):

CREATE TEMPORARY TABLE IF NOT EXISTS 
    auctionView ( INDEX(auction_id) ) 
    ENGINE=MyISAM 
AS (
    SELECT b1.auction_id, b1.bidding_price, b1.user_id
    FROM bid_account b1
    INNER JOIN
    (
        SELECT auction_id, MAX(bidpack_buy_date) AS max_buy_date
        FROM bid_account
        GROUP BY auction_id
    ) b2
        ON b1.auction_id = b2.auction_id AND b1.bidpack_buy_date = b2.max_buy_date
);

UPDATE auction a
INNER JOIN auctionView b
    ON b.auction_id = a.auctionID
SET
    a.auc_final_price = b.bidding_price,
    a.buy_user = b.user_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...