2012-10-10 35 views
1

比方说,一个单独的专栏中,我有两个表 - peoplebonus如何把一个连接表的条件算在同一连接表

------------ 
people 
------------ 
people_id | company_id | job_id 
    1  |  1  | 2 
    2  |  1  | 4 
    3  |  2  | 1 
    4  |  2  | 3 
    5  |  3  | 5 

------------ 
bonus 
------------ 
job_id | bonus_id 
    1  |  101  
    2  |  102  
    3  |  103 

现在,我想有一个连接表像下面

------------- 
JOINED TABLE 
------------- 
people_id | company_id | job_id | bonus_id | no_of_bonus_for_company 
    1  |  1  | 2 | 102 |  1 
    2  |  1  | 4 | NULL |  1 
    3  |  2  | 1 | 101 |  2 
    4  |  2  | 3 | 103 |  2 
    5  |  3  | 5 | NULL |  0 

我必须people_id主要的搜索项中 -

SELECT p.people_id, 
     p.company_id, 
     p.job_id, 
     b.bonus_id 
FROM people p 
LEFT JOIN bonus b 
    ON p.job_id = b.job_id 
WHERE p.people_id IN (1,2,3,4,5) 
ORDER BY p.people_id ASC; 

但是,如何获得连接表的第五列?它实际上计数不。奖励ID的每个公司ID在连接表本身。

+0

可以使用sqlfiddle?它会更容易帮助您 – jcho360

+0

在这里你去 - http://sqlfiddle.com/#!2/63dbc/1/0 – banskt

+0

我没有得到'no_of_bonus_for_company'值来自哪里? – jcho360

回答

1

我只能假设你告诉我们其中的一部分,所以我会保留对DB模式,规范化的判断等

鉴于提出的事实,你可以检索以下方式的信息。

注意:这是TSQL语法,但我不认为MySQL的语法应该是非常不同的,即ISNULL - > IFNULL

SELECT p.people_id 
     , p.company_id 
     , p.job_id 
     , b.bonus_id 
     , ISNULL((
        SELECT COUNT(pt.Job_Id) 
        FROM Bonus bt 
       INNER JOIN People pt 
         ON pt.job_Id = bt.job_Id 
        WHERE pt.company_Id = p.company_Id 
       GROUP BY pt.company_Id     
       ), 0) AS no_of_bonus_for_company 
    FROM People p 
LEFT JOIN Bonus b 
     ON p.job_Id = b.job_Id