我这里有个问题。我有4张表,分别是:students, fee, payments and class
学生
(student_id, firstname, lastname, cellphone, email, address, photofile, class_id)
类
(class_id, class_description, class_date, class_venue)
付款
(payment_id, student_id, payment_date, payment_amount, fee_id)
费用
(fee_id, fee_description, class_id, fee_amount)
基本上,我需要创建一个查询,该查询能够显示学生是否根据 进行了付款
费用
。但是,我已经尝试了从 stackoverflow 获得的所有左连接,但仍然无法获得我想要的结果。
我有这个:
SELECT
students.student_id, fee.fee_id, fee.fee_description,
fee.class_id, fee.fee_amount, students.firstname, students.lastname,
payments.payment_id, payments.payment_date
FROM students
LEFT JOIN class ON students.class_id = class.class_id
LEFT JOIN fee ON fee.class_id = class.class_id
LEFT JOIN payments ON payments.student_id = students.student_id
然后我得到如下结果:
+-----------+--------+---------------------+-----------+-------------+-----------+----------+------------+--------------+
|student_id | fee_id | fee_description | class_id | fee_amount | firstname | lastname | payment_id | payment_date |
+-----------+--------+---------------------+-----------+-------------+-----------+----------+------------+--------------+
| 1 | 1 | Secondary Malay@Dec | 1 | 50 | Bob | Smith | 1 | 2013-12-18 |
| 1 | 1 | Secondary Malay@Dec | 1 | 50 | Bob | Smith | 11 | 2013-12-27 |
| 1 | 5 | Secondary Malay@Jan | 1 | 50 | Bob | Smith | 1 | 2013-12-18 |
| 1 | 5 | Secondary Malay@Jan | 1 | 50 | Bob | Smith | 11 | 2013-12-27 |
| 2 | 2 | Primary Eng@Dec | 2 | 35 | Joe | Doe | 10 | 2013-12-02 |
| 11 | 1 | Secondary Malay@Dec | 1 | 50 | Bryant | Quan | 8 | 2013-12-19 |
| 11 | 5 | Secondary Malay@Jan | 1 | 50 | Bryant | Quan | 8 | 2013-12-19 |
+-----------+--------+---------------------+-----------+-------------+-----------+----------+------------+--------------+
问题:
- 学生 (Bob Smith) 出现了 4 次(应该只出现两次 - 12 月和 1 月费用)。
- 学生 (Bryant Quan) 只支付了 12 月的费用,但查询显示他也支付了 1 月的费用。
- payment_id 应该是唯一的,因此不能出现超过 1 次。
目前,我正在使用 Flash Builder 开发移动应用程序。该应用程序用于跟踪学生的付款,因此,我需要先解决此问题,然后再进行其他操作。如果有人知道如何,请指导我完成此操作。提前谢谢你><"
mysql源代码在这里:http://sqlfiddle.com/#!2/d4482a
最佳答案
在 feeid 上加入付款和费用表,应该会给您正确的结果
编辑:
SELECT
students.student_id, fee.fee_id, fee.fee_description,
fee.class_id, fee.fee_amount, students.firstname, students.lastname,
payments.payment_id, payments.payment_date
FROM students
LEFT JOIN class ON students.class_id = class.class_id
LEFT JOIN fee ON fee.class_id = class.class_id
LEFT JOIN payments ON payments.student_id = students.student_id and Payments.fee_id = fee.fee_id
这会给你所有已经支付和未支付的学生 您可以根据需要使用 where payment_id is null 或 is not null 对其进行过滤 如果 payment_id 为 null,则表示他们尚未付款,否则已付款
关于mysql - 左加入学生付款,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811919/