0

我有 2 张桌子

tbltraining 

trId(PK)   trname 
-------    ------
1         training1 
2         training2
3         training3
4         training4
5         training5
6         training6


tbltrainAssign 

    trassigno    trId(FK)      date1           date2
    ---------    ------     -----------     ----------
    1            1          12/12/2012      12/12/2013
    1            1          12/12/2012      12/12/2013
    2            3          01/12/2012      08/12/2013
    2            3          01/12/2012      08/12/2013
    2            3          01/12/2012      08/12/2013
    3            1          02/12/2012      12/12/2013
    3            1          12/12/2012      12/12/2013

我想要的是来自 tbltraining 的数据以及分配的计数。trId =1 在 tbltrainAssign 中被分配了 2 次,并且 trId 被分配了 1tim 。所以结果应该看起来像

trId        trName       count
1          training1     2
2          training2     0
3          training3     1
4          training4     0
5          training5     0
6          training6     0
4

3 回答 3

2

您需要的是一个简单、直接的方法,JOIN尤其是LEFT JOIN要获得trName在第二个表中没有赋值的 unmatched s,COUNT并且GROUP BY像这样:

SELECT t.trId, t.trname, COUNT(s.trId)
FROM tbltraining t
LEFT JOIN tbltrainAssign s ON t.trId = s.trId
GROUP BY t.trId, t.trname;

SQL 小提琴演示

旁白:请避免在表名和列名中使用描述性前缀,tbl以及tr.

更新:您必须从分配表中选择不同的日期,以便计算每次培​​训的不同分配,如下所示:

SELECT t.trId, t.trname, COUNT(s.trId)
FROM tbltraining t
LEFT JOIN
(
  SELECT DISTINCT trId, DATE(date1), date(date2)
  FROM tbltrainAssign
) s ON t.trId = s.trId
GROUP BY t.trId, t.trname;

更新的 SQL Fiddle 演示

于 2012-11-30T18:45:46.610 回答
1
    select a.trId trId,a.trName trName,count(distinct b.trssigno) count 
    from tbltraining a, tbltrainAssign b 
    where a.trId=b.trId 
    group trId,trName 
    order by trId

这将给出预期的结果

于 2012-11-30T18:46:50.657 回答
0
select t.trId, t.trname, count(t.trassigno) from (
    select tb.trId, tb.trname, ta.trassigno from tbltrainAssign ta
    inner join tbltraining tb on ta.trId=tb.trId
) t
group by t.trId, t.trname
于 2012-11-30T18:47:33.303 回答