2010-05-18 2 views
1
UPDATE counter_reports 
SET `counter`=`counter`+1,`date`=? 
WHERE report_id IN(
        (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `year`=1 
        ORDER BY report_id DESC LIMIT 1), 
        (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `month`=1 
        ORDER BY report_id DESC LIMIT 1), 
        (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `week`=1 
        ORDER BY report_id DESC LIMIT 1), 
        (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `day`=1 
        ORDER BY report_id DESC LIMIT 1) 
       ) 

그런 SQL에 대한 대안이 있습니까? 일, 주, 월 및 연도에 대한 마지막 카운터 보고서를 업데이트해야합니다 (1 씩 증가).Mysql 질문에 대한 업데이트

수동으로 추가하는 경우 sql은 정상적으로 작동하지만 하위 쿼리는 실행되지 않습니다.

감사합니다. :)

+0

오류가 무엇입니까? – Hao

답변

1

MySQL은 좀 구식이다, 이렇게, 그 작동합니다

UPDATE counter_reports 
SET `counter`=`counter`+1,`date`=? 
WHERE report_id IN(
        (select report_id from (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `year`=1 
        ORDER BY report_id DESC LIMIT 1) as x), 
        (select report_id from (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `month`=1 
        ORDER BY report_id DESC LIMIT 1) as x), 
        (select report_id from (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `week`=1 
        ORDER BY report_id DESC LIMIT 1) as x), 
        (select report_id from (SELECT report_id 
        FROM counter_reports 
        WHERE report_name="emails_sent" AND `day`=1 
        ORDER BY report_id DESC LIMIT 1) as x) 
       ) 

또한 여기에 마지막으로 예를 살펴 (MySQL의 코드 문제 관련) : http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html

0

작동하지 않는 기능과 오류는 무엇인가요?

상기 서브 쿼리 조금 REPORT_NAME, 년 이상의 인덱스가

SELECT max(report_id) 
FROM counter_reports 
WHERE report_name="emails_sent" AND `year`=1 

및 경우에 상당

SELECT report_id 
FROM counter_reports 
WHERE report_name="emails_sent" AND `year`=1 
ORDER BY report_id DESC LIMIT 1 

인 개선하고 빠르게 할 수 REPORT_ID 수 있었다.

편집 : ERROR 1093 (HY000): You can't specify target table 'table_name' for update in FROM clause으로 실행중인 경우에 대비하여 workaround이 있습니다.

일반적으로 위의 내용은 약간 추한 것입니다. 그리고 나는 그것이 더 예쁘게되는 징후를 보이지 않을 것이라고 생각합니다. 위의 문제를 처리하는 방법 중 하나는 특히 다중 단계 절차의 일부이므로 (분명히?) 이러한 4 개의 ID를 특정 전환 테이블에 저장하여 프로세스의 다른 부분에서 다시 사용할 수있게하는 것입니다. 보고서를 작성하십시오.

또는 응용 프로그램 쪽에서 ID를 추적하는 것도 효율적입니다 (매개 변수로 전달하여 매개 변수를 업데이트하는 등).