2011-03-20 4 views
1

또한 올바른 위치가 아니면 스택 오버플로로 이동합니다. 나는 여기에 mysql에 대한 질문이있을 때부터 질문을 던져야한다고 말했다.mysql은 제공된 id를 사용할 때 외래 키가있는 조인을 선택합니다

나는 채팅 시스템에 문제가 있습니다. 나는 정상적인 채팅 테이블을 가지고 있으며 개인적인 메시지를 위해 사용된다. 이와 같이 비공개 메시지 채팅 테이블에는 비공개 인 메시지 ID와이를 수신하기로되어있는 사람 만 포함됩니다.

테이블 스키마는 이와 유사합니다.

chat(
id int unsigned not null, 
sayer_id int unsigned not null, 
message_type tinyint unsigned not null, 
message varchar(150) not null, 
timesent timestamp on update current_timestamp, 
); 

색인은 id와 timesent에 있습니다. 기본 색인은 id이며, 시간에 대한 일반 색인입니다. 두 번째 표는 정당합니다.

chat_private(
message_id int unsigned not null, 
target_id int unsigned not null 
) 

기본 메시지 ID는 외래 키이기도합니다. 목표 ID는 현재 현재로서는 하나가 없지만 정상 색인을 넣을 수 있습니다.

그런 다음 시도하려는 쿼리는 다음과 같습니다. SELECT message, timesent FROM chat WHERE timesent>=last_update AND target_id=$userid; last_update는 마지막으로 업데이트가 수행 된 시간을 나타내는 세션 변수입니다. $ userid는 서버 측 세션 변수의 ID입니다. 또한 어떻게해야할지 모르겠다. chat_private 테이블에서 조인하고 싶기 때문에 비슷한 것을한다.하지만 그것 이후부터 모든 ID를 다룰 필요는 없다. target_id/message_id를 보유하므로 무의미합니다.

데이터를 그대로 사용하는 가장 쉬운 방법은 무엇입니까? 작업하기가 불가능하다면 개인 채팅과 그 밖의 다른 채팅을 자체 테이블로 옮기고 그에 따라 데이터 크기를 조정할 것입니다.

+1

질문 같은 것이 여기에 속한다합니다. 데이터베이스 디자인/프로그래밍에 관한 질문은 Stack Overflow에 속합니다. 매우 전문화 된 DB 관리 도구에 관한 질문은 ... 잘 알고 있지만 그 이름도 잊지 만 전문가 DBA 스택 교환 사이트도 있습니다. 그것을 혼란스럽게하는 데 도움이되는 희망! –

+0

아아, 느린 인서트가 있었기 때문에 정확히 어디에 넣을 지 확신하지 못했습니다. 따라서 스택이나이 사이트 문제인지는 몰랐습니다. 나는 미래에 그것을 명심해야한다. – 133794m3r

답변

1

당신은 DB 서버 관리에 대한

SELECT chat.message, chat.timesent FROM chat LEFT JOIN chat_private ON chat.id=chat_private.message_id WHERE chat.timesent>='$timestamp' AND chat_private.target_id=$target_id 
+0

그것이 작동하면 나는 그것을 사용하는 것보다 더 행복하다. 나는 그 순간에 조인에 익숙하지 않았고, 따라서 그것을 통해 어떻게 일할 지 확신하지 못했습니다. 그것이 작동 할 것 같고 이후로, 나는 그것을 나중에 참조 할 수있을 것입니다. 내가 충분히 명성을 쥐고 있다면 나는 upvote하지만 이후로 나는 할 수 없다. – 133794m3r

관련 문제