2011-01-25 4 views
0

В основном я пытаюсь выполнить этот запросОбновление столбца на основе значений из значений в своей таблице

UPDATE communication_relevance SET score = (SELECT ((ces.EXPERT_SCORE * cirm.CONSUMER_RATING) + (12.5 * scs.SIMILARITY)* (1 - EXP(-0.5 * (cal.TIPS_AMOUNT/AT.AVG_TIPS)) + .15))AS ANSWER_SCORE 
FROM COMMUNICATION_RELEVANCE AS cr 
JOIN network_communications AS nc 
ON cr.COMMUNICATION_ID=nc.COMMUNICATIONS_ID 
JOIN consumer_action_log AS cal 
ON cr.ACTION_LOG_ID=cal.ACTION_LOG_ID 
JOIN communication_interest_mapping AS cim 
ON nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID 
JOIN consumer_interest_rating_mapping AS cirm 
ON cr.CONSUMER_ID=cirm.CONSUMER_ID 
    AND cim.CONSUMER_INTEREST_EXPERT_ID=cirm.CONSUMER_INTEREST_ID 
JOIN consumer_expert_score AS ces 
ON nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID 
    AND cim.CONSUMER_INTEREST_EXPERT_ID=CONSUMER_EXPERT_ID 
JOIN survey_customer_similarity AS scs 
ON cr.CONSUMER_ID=scs.CONSUMER_ID_2 
    AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_1 
OR cr.CONSUMER_ID=scs.CONSUMER_ID_1 
    AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_2 
CROSS JOIN 
(SELECT AVG(TIPS_AMOUNT) AS AVG_TIPS 
FROM CONSUMER_ACTION_LOG 
JOIN COMMUNICATION_RELEVANCE 
ON CONSUMER_ACTION_LOG.SENDER_CONSUMER_ID=COMMUNICATION_RElEVANCE.consumer_id) AT) 
; 

Но я получаю эту ошибку:

Error:1/25/2011 1:03:20 PM 0:00:00.135: Lookup Error - MySQL Database Error: You can't specify target table 'communication_relevance' for update in FROM clause 

Любая помощь будет высоко ценится!

+3

MySQL не позволяет вам обновлять таблицу, из которой вы читаете, из одного и того же запроса. Вы могли бы также попытаться изменить все 4 шины на своем автомобиле в то же самое время, двигаясь по автостраде на 200 км в час в ледяных условиях в туманный день. –

+0

Это действительно работает. Вам просто нужно правильно это сформулировать – RichardTheKiwi

ответ

2

Вам использовать UPDATE (.. РЕГИСТРИРУЙТЕСЬ ..) SET Синтаксис

UPDATE communication_relevance X 
JOIN (
    SELECT cr.COMMUNICATION_ID, ((ces.EXPERT_SCORE * cirm.CONSUMER_RATING) 
     + (12.5 * scs.SIMILARITY) 
     * (1 - EXP(-0.5 * (cal.TIPS_AMOUNT/AT.AVG_TIPS)) + .15)) AS ANSWER_SCORE 
    FROM COMMUNICATION_RELEVANCE AS cr 
    JOIN network_communications AS nc ON cr.COMMUNICATION_ID=nc.COMMUNICATIONS_ID 
    JOIN consumer_action_log AS cal ON cr.ACTION_LOG_ID=cal.ACTION_LOG_ID 
    JOIN communication_interest_mapping AS cim ON nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID 
    JOIN consumer_interest_rating_mapping AS cirm ON cr.CONSUMER_ID=cirm.CONSUMER_ID 
     AND cim.CONSUMER_INTEREST_EXPERT_ID=cirm.CONSUMER_INTEREST_ID 
    JOIN consumer_expert_score AS ces ON nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID 
     AND cim.CONSUMER_INTEREST_EXPERT_ID=CONSUMER_EXPERT_ID 
    JOIN survey_customer_similarity AS scs ON 
     cr.CONSUMER_ID=scs.CONSUMER_ID_2 AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_1 
    OR cr.CONSUMER_ID=scs.CONSUMER_ID_1 AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_2 
    CROSS JOIN 
    (
     SELECT AVG(L.TIPS_AMOUNT) AS AVG_TIPS 
     FROM CONSUMER_ACTION_LOG L 
     JOIN COMMUNICATION_RELEVANCE R ON L.SENDER_CONSUMER_ID=R.consumer_id 
    ) AT 
) ON X.COMMUNICATION_ID = AT.COMMUNICATION_ID 
SET X.score = AT.ANSWER_SCORE; 

Как доказательство концепции для всех, кто еще читает это, вот таблица, вы можете создать и попробовать синтаксисом

create table user_news(
    user_id int, article_id int, article_date timestamp, 
    primary key(user_id, article_id)); 
insert into user_news select 1,2,'2010-01-02'; 
insert into user_news select 1,3,'2010-01-03'; 
insert into user_news select 1,4,'2010-01-01'; 
insert into user_news select 2,1,'2010-01-01'; 
insert into user_news select 2,2,'2010-01-02'; 
insert into user_news select 2,3,'2010-01-02'; 
insert into user_news select 2,4,'2010-01-02'; 
insert into user_news select 4,5,'2010-01-05'; 

Теперь запустите обновление (он устанавливает article_date всех записей в article_date MAX от того же пользователя)

update user_news a 
join (
    select b.user_id, max(b.article_date) adate 
    from user_news b 
    group by b.user_id) c 
    on a.user_id=c.user_id 
set a.article_date = c.adate; 

Наконец, проверьте содержимое

select * from user_news; 
0

Вам нужно будет использовать временную таблицу, если вы хотите это сделать.

Я бы сказал, что это время, чтобы думать о том, что вы делаете, почему, и каковы риски :)

+0

Я новичок в SQL. Что вы подразумеваете под временным столом? – Spencer

+0

Вам нужно будет создать таблицу (используя запрос), заполнить ее данными в COMMUNICATION_RELEVANCE, а затем использовать временную таблицу в качестве источника в запросе, который вы пытаетесь запустить. Google «временные таблицы mysql» :) –

0

имя таблицы

COMMUNICATION_RELEVANCE 

это колпачков или опечатка?

+1

Имена таблиц нечувствительны к регистру в OS X и Windows. Он может запустить базу данных? :) –

+0

ok может быть благодарностью за указание на это! – Harish

0

нормализация базовой базы данных указывает, что наличие вычисленного поля в таблице нарушает правила нормализации .... вы должны просто иметь возможность выполнять этот расчет в запросе «на лету», когда вам это нужно. Или создайте представление, которое содержит вычисленное поле.

Смежные вопросы