2012-07-19 4 views
0

메시지가 포함 된 데이터베이스가 있습니다. 메시지는 한 테이블에 저장되고 사용자 정보는 다른 테이블에 저장됩니다. 메시지 테이블에는 사용자 테이블의 작성자 user_id를 나타내는 author_id 열이 있으며 모든 메시지 열이 있으며 사용자 테이블의 "u_"+ user_id의 연결을 나타내는 to_address가 있습니다. 이 두 테이블을 조인 할 수있어 author_id와 to_address 모두에 ID 대신 사용자 이름을 표시합니다.2 열 = 1 열에 두 번 mysql 테이블 가입하기

나는 그런

SELECT 
    (SELECT username 
     FROM users 
     INNER JOIN msgs 
      ON user_id=author_id 
) AS "From", 
    (SELECT username 
     FROM users 
     INNER JOIN msgs 
      ON CONCAT("u_",user_id)=to_address 
) AS "To", 
    (SELECT timestamp(message_time) FROM msgs 
) AS "Sent", 
    (SELECT message_subject FROM msgs 
) AS "Subject", 
    (SELECT message_text AS "Message" FROM msgs 
) AS "Message" 

으로 하위 쿼리를 사용하여 시도 및 "하위 쿼리는 1 개 이상의 행을 반환"있어 명백한 오류 와

SELECT username, ..., username 
    FROM msgs 
    INNER JOIN users 
     ON user_id=author_id AND concat("u_",user_id)=to_address; 

을 시도했습니다. 이 작업을 성공적으로 수행 할 수있는 방법이 있습니까? 다른 이름 테이블의 각 인스턴스를 제공

SELECT 
    from_user.username AS "From", 
    to_user.username AS "To", 
    timestamp(msgs.message_time) AS "Sent", 
    msgs.message_subject AS "Subject", 
    msgs.message_text AS "Message" 

FROM msgs 

INNER JOIN users AS from_user 
ON msgs.author_id = from_user.user_id 

INNER JOIN users AS to_user 
ON msgs.to_address = CONCAT("u_", to_user.user_id); 

기본적으로, 당신은 두 번 msgs 테이블에 users 테이블에 가입하고 다른이 조인 조건 : 당신이 뭔가를 원하는 것처럼

+0

편집 해 주셔서 감사합니다. 나는 그저 일하고 있었다. 말할 필요도없이, StackOverflow에 익숙하지 않습니다. –

+0

[공백으로 코드 서식 지정] (http://meta.stackexchange.com/questions/22186/)에는 공백을 4 줄 들여 쓰기 할 수 있습니다. 에디터 툴바에있는 "{}"버튼은 이것을 처리합니다. 포맷팅에 대한 더 많은 정보와 팁을 원하면 편집기 툴바에서 주황색 물음표를 클릭하십시오. 뭔가를 사용하기 전에 도움말을 읽는 것이 좋습니다. – outis

답변

1

는 소리가 난다. 그런 다음 users 테이블의 특정 인스턴스에서 특정 열을 선택할 수 있습니다.

+0

당신은'FROM msgs'를 놓쳤습니다. –

+0

@PugganSe 그래서 했어요. 고침, 고마워. – cdhowie

+0

구조를 올바르게 이해하고 있다면 "INNER JOIN users AS from_user"가 기본적으로 임시 테이블을 생성하고 있습니까? 그것은 완벽하게 작동했습니다. 단지 각 부분을 이해하는지 보려고했습니다. –

0

난 당신이

SELECT msgs.*, 
     authors.whatever, 
     addresses.to_address 
    FROM msgs 
    JOIN users AS authors ON msgs.author_id = authors.id 
    JOIN users AS addresses ON msgs.address_id = addresses.id 

내 쿼리처럼 뭔가를하고 싶은 아마도 부정확하다고 생각하지만 당신은 아마 내가 여기서 뭘하는지 볼 수 있습니다.

제쳐두고 나는 not abbreviating msgsusing singular table names을 권하고 싶습니다. 두 개의 개별 사용자를 얻기 위해 원하는대로 당신이 필요

+0

스크립트에서이 방법으로 설치되었습니다. 나는 실제로 테이블 레이아웃을 디자인하지 않았습니다. 그것을 변경하면 내 웹 사이트에서 너무 많이 편집해야합니다. –

0

조인 :

select f.username, t.username 
from msgs m 
inner join users f on f.user_id = m.author_id 
inner join users t on concat("u_", t.user_id) = m.to_address 
0

이 것이다 상관 하위 쿼리를 사용하는 대신 가입 사용하여 "author_id"과 "to_address"모두와 관련된 사용자 이름을 반환 . (JOIN을 사용하는 것은 일반적인 방법이지만, 상관 하위 쿼리를 사용하여 접근 방식은 몇 가지 추가적인 유연성을 제공

SELECT (SELECT u.username 
      FROM users u 
      ON u.user_id = CONCAT("u_",u.user_id) = m.to_address 
     ORDER BY u.username LIMIT 1 
     ) AS to_username 
    , (SELECT a.username 
      FROM users a 
      ON a.user_id = m.author_id 
      ORDER BY a.username LIMIT 1 
     ) AS author_username 
    , m.* 
    FROM msgs m 

참고 :.이 때이 MSG에서 행을 돌려 보낼에 가입 내부에서 약간 다릅니다 to_address 또는 author_id에 일치하는 사용자 이름이 없습니다.)

참고 : user_id는 users 테이블에서 고유하다고 가정합니다.

참고 : 사용자 이름 열이 사용자 테이블에 NOT NULL 인 경우에, 당신은 내부 조인 에뮬레이트 할 수 있으며, 일치하는 이름이 author_id 또는 to_address에 대한 발견되지 않는 경우

HAVING to_username IS NOT NULL 
    AND author_username IS NOT NULL 
을 추가하여 행을 반환하지