2014-03-31 1 views
0

레코드를 선택하고 싶지만 (사용자의 테이블에 더 이상 존재하지 않는 삭제 된 계정의 ID를 보낸 사람 제외) (삭제됨) 이것은 "새 메시지"알림tableA.user_id가 user.id에없는 tableA에 대한 select 쿼리에서 레코드를 제외하는 방법

$sql = "SELECT COUNT(pm.id) c 
       FROM `private_messages` pm 
       LEFT JOIN `users` u ON u.`id` = pm.`sender_id` 
       WHERE pm.`recipient_id` = '".$user_id."' 
       AND (SELECT COUNT(id) FROM `pm_views` WHERE `user_id` = '".$user_id."' AND `message_id` = pm.id) = 0 
      "; 

테이블입니다

:

private_messages = id, recipient_id, sender_id, date_sent. 
pm_views = id, message_id, view_date, user_id 

위의 SQL은 "읽지 않음"메시지의 수를 반환합니다.

사용자 테이블에서 존재하지 않는 ID의 메시지를 제외하고 싶습니다. 사용자 private_messages 및 pm_views이 추가

+0

이이 –

답변

1

작동합니다. pm_views에는 모든 "보기"에 대한 레코드가 들어 있습니다 (사용자가 개인 메시지를 열었습니다).

희망 사항 : 사용자가 찾고있는 쿼리는 해당 사용자가 아직 보지 못했지만 사용자에게 더 이상 존재하지 않는 사용자의 보지 않은 메시지를 포함하지 않는 특정 사용자에게 모든 메시지를 집계합니다 표.

나는 다음과 같이이 하위 쿼리와 함께 할 수있는 믿는다 :

select count(*) 
from private_messages pm 
where pm.recipient_id = '" . $user_id . "' 
     and pm.id not in (
      select message_id 
      from pm_views 
     ) 
     and pm.sender_id in (
      select id 
      from users 
     ) 
+0

아 네 ..이 완벽하게 작동 NULL'되지 않은'과 u.id 날 위해 일했습니다. 고맙습니다. 내 자신의 대답은 아래에서뿐만 아니라 작동하지만 왜, 나는 당신의 대답에 작동하는 이유를 이해 cudnt, 불빛에 갔다 :) –

-1

난 당신이 여기에 3 개 테이블이 모여 어떤에서

AND u.id IS NOT NULL 

최종 쿼리

$sql = "SELECT COUNT(pm.id) c 
       FROM `private_messages` pm 
       LEFT JOIN `users` u ON u.`id` = pm.`sender_id` 
       WHERE pm.`recipient_id` = '".$user_id."' 
       AND u.id IS NOT NULL 
       AND (SELECT COUNT(id) FROM `pm_views` WHERE `user_id` = '".$user_id."' AND `message_id` = pm.id) = 0 
      "; 
관련 문제