2008-09-16 4 views
0

웹 응용 프로그램의 모든 사용자에게 표시 할 전역 메시지 목록을 유지 관리하려고합니다. 각 사용자가 이러한 메시지를 개별적으로 읽음으로 표시 할 수 있기를 바랍니다. 나는 2 개의 테이블을 만들었습니다. messages (id, body)messages_read (user_id, message_id).사용자가 읽지 않은 메시지 가져 오기

단일 사용자에 대해 읽지 않은 메시지를 선택하는 SQL 문을 제공 할 수 있습니까? 아니면 이것을 처리하는 더 좋은 방법에 대한 제안이 있습니까?

감사합니다.

답변

1

언급 한 테이블 정의가 완료된 경우 각 메시지의 날짜를 포함시켜 날짜순으로 주문할 수 있습니다.

SELECT id, message 
FROM messages 
LEFT JOIN messages_read 
    ON messages_read.message_id = messages.id 
    AND messages_read.[user_id] = @user_id 
WHERE 
    messages_read.message_id IS NULL 
:

또한,이 선택을 할 수있는 좀 더 효율적인 방법이 될 수있다

5

글쎄, 당신은

SELECT id FROM messages m WHERE m.id NOT IN(
    SELECT message_id FROM messages_read WHERE user_id = ?) 

어디를 사용할 수 있을까? 귀하의 앱에 의해 전달됩니다. 같은

0

뭔가 :

SELECT id, body FROM messages LEFT JOIN 
    (SELECT message_id FROM messages_read WHERE user_id = ?) 
    ON id=message_id WHERE message_id IS NULL 

약간 까다로운 내가 성능을 확장하는 방법을 잘 모르겠어요,하지만 작동합니다.

관련 문제