当前位置: 首页 > 知识库问答 >
问题:

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

宗政才俊
2023-03-14

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

学生

费用

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

我的代码是:

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个答案

澹台欣怿
2023-03-14

对于您想要的结果,我建议使用条件聚合和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<>小提琴。

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

郭辉
2023-03-14

您可以使用左连接来连接学生和他们的费用,然后使用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;
 类似资料:
  • 我有两个数据表 和 , 可能比 更大,列更多。我想在中选择两列DT1中的行,其中的两列在中两列的同一行中具有完全匹配项。例如 输出,,我正在寻找的是 我的问题是,当我试图子集时,我也会得到那些只有一列匹配的行 我可以用一个笨重的循环来获得我想要的输出, 但是我想知道是否有更智能的data.table版本。这可能很简单,但是我无法从中拼凑出来。

  • 我正在开发一个基于SAAS的站点,我必须将两个DBs中的两个表连接起来,比如说DB1中的table1和DB2中的table2。我必须使用cakephp中的join从表1和表2获取匹配记录,但它会抛出如下错误: 错误:SQLSTATE[42000]:语法错误或访问冲突:1142 SELECT命令拒绝用户'dbname'@'localhost'访问表'table_name'。 有谁能解释一下如何使用c

  • 问题内容: 我想在MySQL中将数据从一个表复制到另一个表。 表1(现有表): 表2(新表) 我想将一些数据字段从表1复制到表2。 可以使用MySQL查询完成吗? 问题答案: 这将做您想要的: 如果要包括table1中的所有行。否则,如果只想添加table1的子集,则可以在末尾添加WHERE语句。 我希望这有帮助。

  • 创建表TableA(id int,名称varchar(20),partNumber varchar(30)); 值为: 创建表TableB(id int,名称varchar(20),零件号varchar(30)); 我尝试了以下的查询,所有的结果都是相同的14个记录,这是不正确的。 查询1: 选择b.ID作为Bid,b.Name作为Bname,b.PartNumber作为BPart,a.ID作为A

  • 问题内容: 我想从一个表中读取所有数据,然后将一些数据插入到另一个表中。我的查询是 但我有一个错误 请帮我。 问题答案: 您可以使用INSERT … SELECT语法。请注意,您可以在SELECT部分​​中直接引用“ 1”。

  • 问题内容: 我有以下表格- 这是SQLFIDDLE 分类 和 产品展示 我想获取类别列表以及活跃产品的数量。如果某个类别的产品均未激活,则应返回0。 有点像下面的表格- 我想出了以下查询- 仅当 每个类别 中至少有一个产品处于活动状态时, 以上 查询才有效 。如果没有产品面世,它应该返回为 0 我怎样才能解决这个问题 ? 这是SQLFIDDLE 问题答案: 使用代替: 将谓词from 子句移至,这