我有两张桌子的学生和付款。 付款表存储学生费用支付的记录。如何获得所选课程未交学费的学生总数?例如会话: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秒
答案 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