2011-01-17 5 views
2

3 개의 테이블이 있습니다. 받은 편지함, 보낼 편지함 및 메시지단일 행의 MySQL 다중 키

단일 메시지의 경우 데이터는 다음과 같습니다.

메시지 :

+----------+----------------+ 
|message_id|content   | 
+----------+----------------+ 
|1   |'lorem ipsum...'| 

받은 편지함 :

+--------+----------+-----+-------+ 
|inbox_id|message_id|to_id|from_id| 
+--------+----------+-----+-------+ 
|1  |1   |1 |1  | 
|2  |1   |2 |1  | 
|3  |1   |3 |1  | 

보낼 편지함 : 단일 사용자가 여러 사람의 PM을 보낼 수

+---------+----------+-----+-------+ 
|outbox_id|message_id|to_id|from_id| 
+---------+----------+-----+-------+ 
|1  |1   |1,2,3|1  | 

. 각받는 사람에 대해 새받은 편지함 레코드가 생성됩니다.

지금 현재 수신자와 상관없이 하나의 보낼 편지함 레코드를 생성하고 있습니다.

PM을 보내면 위의 데이터를 정확히 생성 할 수 있지만 보낼 편지함의 사용자 이름을 생성하는 데 문제가 있습니다.

보낼 편지함에서 다음과 같은 작업을 수행 할 수 있기를 원합니다 (아래 쿼리는 수행하고 싶지만 물론 작동하지 않습니다).

SELECT 
    users.username, 
    messages.message_id, 
    messages.subject 
FROM 
    messages 
JOIN 
    outbox ON outbox.message_id = message.message_id 
JOIN 
    users ON users.user_id IN (outbox.to_id) 
WHERE 
    outbox.from_id = 1 

되는 최종 결과

+-------------------+----------+----------------+ 
|username   |message_id|subject   | 
+-------------------+----------+----------------+ 
|user1, user2, user3|1   |'lorem ipsum...'| 

답변

4

의 MySQL의 IN 당신이 생각했던 방식으로 작동하지 않습니다. outbox.to_id은 문자열이고 users.user_id은 int입니다. MySQL은 to_id를 int로 변환하려고 시도하고 ','(첫 번째 비 int 문자)에 도달하면 중지하므로 '1,2,3'이 '1'로 변환됩니다.

This question 내가 도움을 청하면 승인 된 답변을 읽어보십시오.

하나의 필드에 '1,2,3'을 저장하는 대신 전자 메일을 보낼 각 사용자별로 별도의 행이 있어야합니다.

+0

나는 그것이 답이 될 것 같았습니다. 도와 주셔서 감사합니다! – castis

+0

예, 한 필드에 ID 목록을 저장하는 것이 가장 좋은 방법은 아닙니다. 나는 그것을 또한 배웠다. 당신은 할 수 있지만 최선의 선택은 아닙니다. –