在我的SQL中加入两个表不返回结果集

时间:2018-09-27 14:19:42

标签: mysql sql join

嗨,我在MySql数据库中使用3个表检索特定数据集时遇到了一个问题。表如下

Student
SID | Name | Age | Telephone

Term
TID | Start | End

Payment
PID | TID | SID | Value

SID是学生表的主键。 TID是术语表的主键。 PID是付款表的主键。 Payment表中的TID和SID是外键引用。

学生表包含学生的数据。期限表包含期限开始日期和结束日期的数据。付款表包含有关学生付款的数据。付款表中的记录可以包含TID,也可以不包含TID。如果是注册付款,将没有TID。否则,这是一个学期费用,并且会有TID。我想要的是直到今天还没有支付此学期费用的学生名单。假定此TID在变量中。如何获得学生名单?它看起来非常容易。但是我无法在这个整天找到答案

2 个答案:

答案 0 :(得分:0)

您需要在付款中仅列出那些没有TID填充记录且其开始日期和结束日期在今天的两边的学生

SELECT * FROM
  student
  LEFT OUTER JOIN
  (select * from payment where TID is not null and NOW() BETWEEN start and end) this_term_payments
  on student.id = this_term_payments.sid
WHERE
  this_term_payments.ID is null

有很多方法可以给这只猫蒙皮。这是一个。我们将付款表过滤为该词项的付款列表(这是内部查询)。然后将其加入学生。左联接表示我们获得所有学生,如果存在this_term_payments行,则与this_term_payments匹配;如果不存在学期付款,则在每个this_term_payments列中为NULL。然后,where子句通过查找左联接创建的空值来将整个结果集过滤为“仅那些没有按期付款的人”

FWIW,您的问题获得了一致好评,因为它不包含示例数据,也不展示我们希望在SQL问题上看到的努力水平。如果您要包含所有表的示例数据以及要查看的示例结果集,则意味着我们可以编写满足您要求的精确查询。

对我来说,这是一把双刃剑。即使您后来意识到不是您想要的东西,我们也可以提供您想要的东西(用英语问要比给出示例结果集更加模糊),但与此同时,我们基本上成为了一些免费的外包家庭作业承包商或类似承包商,为您工作,并一路消除学习机会。希望您会接受此查询(很可能不会输出您想要的所有内容,或输出您不想要的东西),并在对该技术进行了解释之后利用该查询来制作想要的内容。:)

对于一个相对比较受欢迎的SQL问题(在我完成对它的评论之后,我对其进行了编辑),并且吸引了一些不错的答案,请在此处查看:

Fill in gaps in data, using a value proportional to the gap distance to data from the surrounding rows?

这就是您需要询问SQL问题的方式-说出您想要的内容,提供示例数据,提供脚本来帮助人们创建相同的数据,这样他们就可以发挥自己的想法,而无需先创建数据就很无聊。我之所以选择它,是因为当时我什至没有进行任何SQL尝试。这只是一个思想练习。没有任何工作不一定是问一个好问题的障碍

答案 1 :(得分:0)

尝试一下:

   select s.name, p.value from Student s, Term t, Payment p where t.TID = p.TID and s.SID=p.SID and p.TID is null;