如何从MySQL中的两个表中获取数据并对每个表进行计数?
如何在一个查询中写入此内容 我有两张这样的桌子叫(迟到): 另一个喜欢这个叫做(缺席): 我希望结果如下表所示: 其中(计算迟到次数)计算迟到次数,(计算缺席次数)计算缺席时间如何从MySQL中的两个表中获取数据并对每个表进行计数?,mysql,Mysql,如何在一个查询中写入此内容 我有两张这样的桌子叫(迟到): 另一个喜欢这个叫做(缺席): 我希望结果如下表所示: 其中(计算迟到次数)计算迟到次数,(计算缺席次数)计算缺席时间 name Count late Count absent A 4 6 B 1 1 C 3 1 我试过这样的方法: 这没用 SELECT * FROM (SELECT n
name Count late Count absent
A 4 6
B 1 1
C 3 1
我试过这样的方法:
这没用
SELECT
*
FROM
(SELECT name, COUNT(*) AS '# count absent' FROM absent GROUP BY s_id) t1
INNER JOIN
(SELECT name, COUNT(*) AS '# count Late' FROM late GROUP BY s_id) t2
ON t1.s_id = t2.s_id ;
如果需要在s_id上联接,则必须在“子选择”中选择这些列
SELECT
*
FROM
(SELECT s_id, name, COUNT(*) AS '# count absent'
FROM absent GROUP BY s_id) t1
LEFT JOIN
(SELECTs_id, name, COUNT(*) AS '# count Late'
FROM late GROUP BY s_id) t2
ON t1.s_id = t2.s_id ;
否则,由于没有此列的列,因此无法加入结果select。此处需要完整的外部联接,以确保保留迟到或缺席的人员,但不能同时保留两者。MySQL没有内置的完全外部连接支持,但可以模拟:
SELECT t1.name,
t2.late_cnt,
t1.absent_cnt
FROM
(SELECT s_id, name, COUNT(*) AS absent_cnt
FROM absent GROUP BY s_id, name) t1
LEFT JOIN
(SELECT s_id, name, COUNT(*) AS late_cnt
FROM late GROUP BY s_id, name) t2
ON t1.s_id = t2.s_id
UNION
SELECT t1.name,
t2.late_cnt,
t1.absent_cnt
FROM
(SELECT s_id, name, COUNT(*) AS absent_cnt
FROM absent GROUP BY s_id, name) t1
RIGHT JOIN
(SELECT s_id, name, COUNT(*) AS late_cnt
FROM late GROUP BY s_id, name) t2
ON t1.s_id = t2.s_id
试试这个。我还没试过。希望它能起作用。请尝试以下内容。这对我有用
select
coalesce( t1.name,t2.name) name,coalesce( t1.late,0) ,coalesce(t2.[absent],0)
from
(select name,s_id, count(*) as 'late' from late group by s_id,name ) t1
FULL OUTER JOIN
(select name,s_id, count(*) as 'absent' from [absent] group by s_id,name )
t2 on t1.s_id = t2.s_id
order by name
使用两个表的并集:迟到和缺席。。。然后总结迟到和缺席的人数 试试这个:
SELECT
SUM(tardies) as 'total_lates', SUM(absences) as 'total_absences', name, s_id
FROM
((SELECT
COUNT(*) as 'tardies',
0 as 'absences',
name,
s_id
FROM
lates
GROUP BY
s_id
)
UNION
(SELECT
0 as 'tardies',
COUNT(*) as 'absences',
name,
s_id
FROM
absents
GROUP BY
s_id
)
)
as maintable
GROUP by s_id
ORDER BY name
但这将消除只缺席或迟到的名称。@TimBiegeleisen thaks correte更新左连接。。最终,OP可以使用一个表来表示所有的名称,并延迟和缺席加入表以避免丢失名称
我还没有尝试过。。。如果您尝试过,您会发现MySQL中没有完全连接。感谢它的工作,但是没有完全连接,我只使用了连接。同样,您的查询将过滤掉那些只缺席但没有迟到的人。现在这将返回两个表记录!!请让我知道你的看法。谢谢MySQL中没有完整的外部联接。但也许OP并不关心这个边缘案件。我必须感谢你,因为我从你的询问中学到了一些新的东西。谢谢不。。。每人只有一张唱片。。。每个记录都有“迟到计数”和“缺席计数”。。。主表中有一个group by。。。
SELECT
(case when t1.name is not null then t1.name else t2.name end) as name,t1.absent,t2.late
FROM
(SELECT name, COUNT(*) AS 'absent'
FROM absent GROUP BY name) t1
FULL JOIN
(SELECT name, COUNT(*) AS 'late'
FROM late GROUP BY name) t2
ON t1.name = t2.name ;
select
coalesce( t1.name,t2.name) name,coalesce( t1.late,0) ,coalesce(t2.[absent],0)
from
(select name,s_id, count(*) as 'late' from late group by s_id,name ) t1
FULL OUTER JOIN
(select name,s_id, count(*) as 'absent' from [absent] group by s_id,name )
t2 on t1.s_id = t2.s_id
order by name
SELECT
SUM(tardies) as 'total_lates', SUM(absences) as 'total_absences', name, s_id
FROM
((SELECT
COUNT(*) as 'tardies',
0 as 'absences',
name,
s_id
FROM
lates
GROUP BY
s_id
)
UNION
(SELECT
0 as 'tardies',
COUNT(*) as 'absences',
name,
s_id
FROM
absents
GROUP BY
s_id
)
)
as maintable
GROUP by s_id
ORDER BY name