如何在MySQL中对来自两个不同表的记录进行计数

时间:2019-04-15 12:58:16

标签: mysql

我有两张桌子的学生和付款。 付款表存储学生费用支付的记录。如何获得所选课程未交学费的学生总数?例如会话:2017/2018

我使用以下代码,花了10秒钟以上的时间得出结果。

SELECT   Count(students.registrationno)
FROM     students
WHERE    registrationno NOT IN
         (
          SELECT   DISTINCT payments.reg_no
          FROM payments
          WHERE payments.`session`='2017/2018'
         )
students
+----------------+------------+--------------+
| registrationno |   surname  |     firstname|
|----------------+------------+--------------|
| 100009         |   OGBODO   |     IPU      |
| 100014         |   IKE      |     JOSEPH   |
| 100033         |   JOHN     |     AJENE    |
+----------------+------------+--------------+

payments

+-------------+---------+-----------+ 
| payment_id  |  reg_no |   session |
|-------------+---------+-----------+
| 1           |  100009 | 2017/2018 |
| 2           |  180689 | 2017/2018 |
| 3           |  180680 | 2017/2018 |
+-------------+---------+-----------+
SELECT  COUNT(students.registrationno)
FROM    students
WHERE   registrationno NOT IN 
       (
        SELECT   DISTINCT payments.reg_no
        FROM     payments
        WHERE    payments.`session`='2017/2018'
       )

我希望输出少于10秒

2 个答案:

答案 0 :(得分:0)

使用联接

SELECT count(*) FROM students st
LEFT JOIN 
(SELECT * FROM payments WHERE session='2017/2018') pmt 
ON st.registrationno = pmt.reg_no WHERE pmt.reg_no IS NULL;

条件pmt.reg_no is null确保查询将返回 该学生在相应的会话中没有付款记录的记录。

还创建适当的索引(例如,students.registrationno) 可以显着改善性能。

答案 1 :(得分:0)

如评论中所述,添加indexes可以帮助您提高性能。

以下是您可以尝试的另一种方法,但是我认为它的效率不如NOT IN

SELECT  count(s.registrationno)
FROM    students s
LEFT JOIN
        payments p
ON      p.reg_no  = s.registrationno
WHERE   p.reg_no IS NULL
AND P.session='2017/2018'

您也可以尝试NOT EXISTS