Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从MySQL中的两个表中获取数据并对每个表进行计数?_Mysql - Fatal编程技术网

如何从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