2013-03-22 180 views
0

我要连接两个包含另一个表中的两列的表。MySQL连接来自两列的两个表

表用户

id | first_name | last_name | 
---+------------+-----------+ 
1 | John  | Doe  | 
2 | Jane  | Doe  | 
3 | Some  | Name  | 

表邮票

id | date | applicant_id | app_by_id | 
---+------------+---------------+-----------+ 
1 | 2013-03-15 | 1    | 2   | 
2 | 2013-03-10 | 2    | 3   | 
3 | 2013-03-13 | 2    | 1   | 

我想要什么显示:

date | applicant | app_by | 
------------+-----------+-----------+ 
2013-03-15 | John Doe | Jane Doe | 
2013-03-10 | Jane Doe | Some Name | 
2013-03-13 | Jane Doe | John Doe | 

我的查询:

SELECT CONCAT_WS(' ', NULLIF(t1.first_name, ' '), NULLIF(t1.last_name, ' ')) AS applicant, 
    CONCAT_WS(' ', NULLIF(t1.first_name, ' '), NULLIF(t1.last_name, ' ')) AS app_by, 
    t2.date 
    FROM users t1 
    INNER JOIN stamp t2 ON applicant_id = t1.id 

我知道我的查询有问题,但我不知道如何解决它。

回答

0

你可能想使用LEFT JOIN让你在即使其它连接条件未能每一列获取值。以下代码也适用于常规的JOIN

SELECT s.date, 
CONCAT_WS(' ', NULLIF(u1.first_name, ' '), NULLIF(u1.last_name, ' ')) AS applicant, 
CONCAT_WS(' ', NULLIF(u2.first_name, ' '), NULLIF(u2.last_name, ' ')) AS app_by 
FROM stamp s 
LEFT JOIN users u1 ON s.applicant_id = u1.id 
LEFT JOIN users u2 ON s.app_by_id = u2.id 

证明:http://sqlfiddle.com/#!2/39aff/1/0

+0

谢谢。这是我需要的答案。 – otezz 2013-03-22 09:12:02

0

试试你的加入像

SELECT CONCAT_WS(' ', NULLIF(u1.first_name, ' '), NULLIF(u1.last_name, ' ')) AS applicant, 
     CONCAT_WS(' ', NULLIF(u2.first_name, ' '), NULLIF(u2.last_name, ' ')) AS app_by, 
     s.date 
FROM stamp s INNER JOIN 
     user u1 ON s.applicant_id = u1.id INNER JOIN 
     user u2 ON s.app_by_id = u1.id 
+0

@AdamPlocher是,纠正它感谢 – 2013-03-22 04:59:47

0

而是加入的,尽量使用子查询这个样子。

SELECT date, 
(SELECT CONCAT_WS(' ', NULLIF(first_name, ' '), NULLIF.last_name, ' ')) from USERS WHERE id = s.applicant_id) as applicant, 
(SELECT CONCAT_WS(' ', NULLIF(first_name, ' '), NULLIF.last_name, ' ')) from USERS WHERE id = s.app_by_id) as app_by 
from stamp s