Mysql 正在返回未选择任何行的联接

Mysql 正在返回未选择任何行的联接,mysql,sql,join,Mysql,Sql,Join,在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_d

在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;
分解它的方法是从第一个表开始,然后添加连接(以及where条件,尽管这里没有),一次添加一个,直到出现数据问题。我发现使用select*或select top 1*(或top 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
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;
在某个时刻,您将看到记录在哪里,这就是问题所在的位置。然后,您可能需要查看要加入的字段以及数据集中的字段中的数据,以了解它们不返回任何匹配项的原因。例如,如果您是在日期上加入的,则它们可能在一个表中存储为日期,在另一个表中存储为varchar和date“2016年1月1日”不等于“2016年1月1日”,或者该列有时有某种前缀或后缀不在另一个表中。一个表中有PR2345,另一个表中有2345。有时查询是正确的,没有行真正满足条件。这可能是因为数据尚未完全填充(考虑为尚未启用的系统编写报告,没有关于已完成操作的数据,因为尚未完成任何操作),或者是因为需求在某些假设中是错误的,或者是因为不应该有匹配的记录。它甚至可能是数据输入中的一个bug

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


在您的情况下,问题看起来好像在第一个表中。您的示例中有讲师ID和其他字段的空白,因此没有任何内容可供加入。(您只提供了一个示例,因此表的其余部分可能与此不同。)如果在这种情况下,由于将添加数据的功能尚未激活,数据尚未存在,则您只能通过向表中添加测试数据来测试查询。请确保在完成单元测试后删除此数据。如果数据应该已经存在,那么您需要查看应用程序中的插入以查找错误。

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

让我们从您的查询开始:

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;
分解它的方法是从第一个表开始,然后添加连接(以及where条件,尽管这里没有),一次添加一个,直到出现数据问题。我发现使用select*或select top 1*(或top 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
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;
在某个时刻,您将看到记录在哪里,这就是问题所在的位置。然后,您可能需要查看要加入的字段以及数据集中的字段中的数据,以了解它们不返回任何匹配项的原因。例如,如果您是在日期上加入的,则它们可能在一个表中存储为日期,在另一个表中存储为varchar和date“2016年1月1日”不等于“2016年1月1日”,或者该列有时有某种前缀或后缀不在另一个表中。一个表中有PR2345,另一个表中有2345。有时查询是正确的,没有行真正满足条件。这可能是因为数据尚未完全填充(考虑为尚未启用的系统编写报告,没有关于已完成操作的数据,因为尚未完成任何操作),或者是因为需求在某些假设中是错误的,或者是因为不应该有匹配的记录。它甚至可能是数据输入中的一个bug

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


在您的情况下,问题看起来好像在第一个表中。您的示例中有讲师ID和其他字段的空白,因此没有任何内容可供加入。(您只提供了一个示例,因此表的其余部分可能与此不同。)如果在这种情况下,由于将添加数据的功能尚未激活,数据尚未存在,则您只能通过向表中添加测试数据来测试查询。请确保在完成单元测试后删除此数据。如果数据应该已经存在,那么您需要查看应用程序中的插入以查找bug。

显示足够的示例数据以演示