2016-05-31 2 views
1

그래서, 사용자가 페이지를 보았는지 아닌지를 확인하는 프로그램에 대한 다중 쿼리를 작성하고 있습니다. 그들이 그것을 보지 않았다면 views이라는 테이블에 레코드가 생성되고 numViews이라는 레코드가 pages이라는 테이블에서 업데이트되는 반면, 이미 읽은 것이라면 아무 일도 일어나지 않습니다.MySQL - 테이블 IF 레코드가 다른 테이블에 존재하지 않습니다.

모든 레코드를 고유하게 유지하는 views에 레코드를 삽입하기 위해 작성된 코드가 있습니다. 내가 직면하고있는 문제는 pages에 기록을 갱신 할 때입니다. 모든 도움이

INSERT INTO views 
    (`pageID`, `viewerID`) 
SELECT 
    T.* 
FROM 
    (SELECT 
     '.$this->pageID.' pageID, 
     '.$_SESSION['userID'].' viewerID 
    ) 
T LEFT JOIN 
    views 
ON 
    views.creationID = T.pageID 
AND 
    views.viewerID = T.viewerID 
WHERE 
    views.viewerID IS NULL; 

를 감사 :

if (record_exits_in_table_named_views == false) { 
    UPDATE record IN pages 
    INSERT record INTO views 
} 

다음은 레코드를 추가 내 쿼리입니다 : 다음 의사의 관점에서

, 나는이 달성 될하고자하는 것입니다. 감사

업데이트에 대한
+0

에 비슷한 LEFT JOIN를 사용 그것은 : 뷰 테이블에 대한 삽입 트리거를 생성하여 페이지 테이블을 업데이트하거나 필요할 때 뷰의 항목 값을 계산하므로 페이지에 값이 필요하지 않습니다 (트리거를 사용하여 실제로는 단지 op 일 것이다. 속도를 높이기위한 시간 결정). – Solarflare

답변

1

내가 이해한다면 바로이 될 ..should

update pages 
set numViews =numViews +1 
where (pageID, viewID) not in (select pageID, viewID from views) 
+0

완벽하게 작동합니다. 감사 –

1

(절에되지 않음) 귀하는 데이터베이스 핸들 할 수있는 당신의 UPDATE

UPDATE pages AS p 
LEFT JOIN views AS v ON v.pageID = p.pageID AND v.viewerID = viewerID 
SET p.numViews = p.numViews + 1 
WHERE p.pageID = {$this->pageID} AND p.viewerID = {$this->viewerID} 
AND v.viewerID IS NULL 
관련 문제