【问题标题】:How to fetch data from two tables in MySQL and count each one?如何从 MySQL 中的两个表中获取数据并计算每个表?
【发布时间】:2016-11-13 18:13:57
【问题描述】:

我怎样才能在一个查询中写出来?

我有两张像这样的表,称为(迟到):

id     name     S_id
1       A         6
2       A         6
3       B         5
4       C         8
5       A         6
6       A         6
7       C         8
8       C         8

另一个喜欢这个叫(缺席):

id     name     S_id
1       A         6
2       A         6
3       A         6
4       A         6
5       A         6
6       A         6
7       B         5
8       c         8

我想要这个表格的结果:

其中 (count late) 计算迟到的次数,而 (count missing) 计算缺勤的时间。

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 ;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用两个表的并集:lates 和absents...然后将lates 和absents 的数量相加。

    试试这个:

    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
    

    【讨论】:

    • 不...每人只有一条记录...每条记录都有“迟到计数”和“缺席计数”...主表有一个分组依据...跨度>
    【解决方案2】:

    如果您需要加入 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 ;
    

    否则结果选择不能被连接,因为没有此列

    【讨论】:

    • 但这将消除那些要么只是缺席要么只是迟到的名字。
    • @TimBiegeleisen thaks correte update the left join .. 最终 OP 可以使用一个表来保存所有的名字,并为避免丢失名字而迟到和缺席加入表
    【解决方案3】:
    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 ;
    

    试试这个。我没试过。希望它有效。

    【讨论】:

    • I haven't tried ...如果您尝试过,您会发现MySQL中没有完全连接。
    • 谢谢它的工作,但没有完全加入我只使用了加入。
    【解决方案4】:

    您需要在此处进行完整的外部联接,以确保保留迟到或缺勤的人,但不能同时保留这两者。嗯,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
    

    【讨论】:

      【解决方案5】:

      请尝试以下。它对我有用。

      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
      

      【讨论】:

      • 同样,您的查询将过滤掉仅缺席但未迟到的人。
      • 现在这将返回两个表记录!请让我知道你的看法。谢谢!!
      • MySQL 中没有完全外连接。但也许 OP 并不关心这种极端情况。
      • 我必须感谢您,因为我从您的查询中学到了一些新东西。谢谢!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多