提问者:小点点

如何在MySQL中得到两个表连接的数据,排除一个表的一些条件数据?


我有两张桌子:学生桌和收费桌

学生

费用

我想让学生(谁没有支付费用)为虚构:像这样...

我的代码是:

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;

共2个答案

匿名用户

您可以使用左连接来连接学生和他们的费用,然后使用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<>小提琴。

请注意,在列中存储月份名称通常是一个非常糟糕的主意。例如,它不区分年份。使用日期要好得多。