联接返回时没有选择任何行

时间:2016-12-20 14:42:11

标签: mysql sql join

我试图从连接语句中的几个MySQL表中提取一些数据时遇到了一些麻烦。

我的表和属性是:

    appointment_end_time (table)
    appointment_end_time_id (int)(pk)(ai)
    appointment_end_date (datetime)

    appointment_start_time (table)
    appointment_date_id (int)(pk)(ai)
    appointment_start_date (datetime)

    instructor(table)
    instructor_id (int)(pk)(ai)
    firstname varchar(45)
    lastname varchar(45)

    appointment_timetable
    appointment_timetable_id int(11) AI PK 
    instructor_id int(11) FK
    appointment_date_id int(11) FK 
    appointment_end_time_id int(11) FK


SELECT a.appointment_timetable_id,  i.instructor_id, ad.appointment_start_date, aet.appointment_end_date
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id =  a.appointment_date_id
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;

但是,此代码在执行时没有选择任何行,因此我想知道我做错了什么,任何帮助将不胜感激

示例行:                            (appointment_end_time)

     appointment_end_time_id  appointment_end_date
                  1            2016-12-26 14:00:00
                  2            2016-12-24 13:00:00
                  3            2016-12-26 13:00:00
                       (appointment_start_time)

     appointment_date_id  appointment_start_date
                  1            2016-12-26 15:00:00
                  2            2016-12-24 16:00:00
                  3            2016-12-26 15:30:00

     instructor_id      firstname       lastname

           1              Sasha         Thompson

           2              Laura         Robinson

           3              John          Walters

                         appointment_timetable


appointment_timetable_id instructor_id appointment_date_id appointment_end_time_

        1               Blank             Blank                Blank 

        2               Blank             Blank                Blank  

        3               Blank             Blank                Blank

1 个答案:

答案 0 :(得分:3)

您需要学习如何自己诊断问题。查询没有返回预期结果是一个常见问题,您应该了解如何解决问题以找到问题。

让我们从您的查询开始:

SELECT a.appointment_timetable_id,  i.instructor_id, ad.appointment_start_date, aet.appointment_end_date
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id =  a.appointment_date_id
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;

你要做什么来分解它是从第一个表开始,然后添加连接(以及条件,尽管你没有这里有任何条件),一次一个,直到出现数据问题。我发现这是最简单的方法,使用select *或选择top 1 *(或者前10名,因为我通常喜欢看多个记录)而不是字段列表,因为那样你就不必寻找那些字段了与您尚未添加的联接相关联。

首先从

开始
SELECT top 10 *
FROM db12405956.appointment_timetable a

然后尝试

SELECT top 10 *
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id

然后

SELECT top 10 *
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id =  a.appointment_date_id

最后

SELECT top 10 *
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id =  a.appointment_date_id
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;

在某些时候,您会看到记录丢失的位置,也就是问题的位置。然后,您可能需要查看要加入的字段以及数据集中的数据,以了解它们未返回任何匹配项的原因。例如,如果您加入日期,则可以将它们存储为一个表中的日期,将varchar存储在另一个表中,并将日期存储在日期" 01/01/2016'不等于2016年1月1日'或者有时列中有某种前缀或后缀不在另一个表中。像一个表中的PR2345和另一个表中的2345。有时查询是正确的,没有行真正符合条件。这可能是因为数据尚未完全填充(想想为尚未生效的系统编写报告,没有已完成操作的数据,因为尚未完成)或者因为某些假设中的要求是错误的,或者是因为应该没有匹配的记录。它甚至可能是数据输入中的错误。

根据问题的性质,您可能需要返回所有记录或仅使用select top 1(因为所有记录都在消失)。使用SELECT *这种方式将有助于返回太多或重复的记录,有时候是返回的字段会影响结果集。 请注意,我并不是说在最终结果集中使用SELECT *,它只是在这里用作诊断工具。

在您的情况下,问题看起来好像在第一个表中。教师ID和样本中的其他字段都有空白,因此没有任何内容可以加入。 (您只提供了一个示例,因此表的其余部分可能不是这样的。)如果这种情况还没有由于将其添加到尚未生效的功能,那么您可以测试您的查询只有将测试数据添加到表中。完成单元测试后,请务必删除此数据。如果数据应该存在,那么您需要查看应用程序中的插入错误。