我有两张桌子:学生桌和收费桌
学生
费用
我想让学生(谁没有支付费用)为虚构:像这样...
我的代码是:
SELECT s.sid,s.name,s.roll_no,f.fee
from student s
left join
fee f
ON f.fid = s.sid
AND f.month = 'January'
where s.sid NOT IN (SELECT s_id from fee
where month = 'February')
order by c.id;
我在两个月的所有学生中都得到了零值-------------------------------------
修正后,这段代码可以在mysql工作台上运行,但不能在Java应用程序中运行。
SELECT
s.sid,s.name,s.roll_no, ifnull(f.fee,0) as pre_month,0 as current_month
from student s
left join
fee f
ON f.s_id = s.sid
AND f.month = 'January'
where s.sid NOT IN
(SELECT s_id from fee
where month = 'February')
order by s.sid;
您可以使用左连接来连接学生和他们的费用,然后使用having子句来过滤列表到那些没有二月份费用的学生。下面的查询应该会给你一个二月份没有支付学费的所有学生的列表。
看起来您可能在fee表中使用了错误的列来进行连接。看起来您可能需要s_id
而不是fid
。
select s.*
from students s
left join fee f on f.s_id=s.sid and f.month='February'
having f.fid is null;
对于您想要的结果,我建议使用条件聚合和having
子句:
SELECT s.sid, s.name, s.roll_no,
SUM(CASE WHEN f.month = 'January' THEN f.fee ELSE 0 END) as january,
SUM(CASE WHEN f.month = 'February' THEN f.fee ELSE 0 END) as february
FROM student s LEFT JOIN
fee f
ON f.fid = s.sid AND f.month = 'January'
GROUP BY s.sid, s.name, s.roll_no
HAVING SUM(CASE WHEN f.month = 'February' THEN f.fee ELSE 0 END) = 0 AND
SUM(CASE WHEN f.month = 'January' THEN f.fee ELSE 0 END) > 0;
这是一个dB<>小提琴。
请注意,在列中存储月份名称通常是一个非常糟糕的主意。例如,它不区分年份。使用日期要好得多。