使用LEFT JOIN的MySQL SELECT中的空行

时间:2009-06-26 18:43:11

标签: mysql left-join

我有三个表:usersfacilitiesstaff_facilities

users包含普通用户数据,我的最重要字段为users.idusers.firstusers.last

facilities也包含大量数据,但除了facilities.id之外,这些数据都不一定与此示例相关。

staff_faciltiesstaff_facilities.id(int,auto_inc,NOT NULL),staff_facilities.users_id(int,NOT NULL)和staff_faciltities.facilities_id(int,NOT NULL)组成。 (那是满口的!)

staff_facilities引用其他两个表的ID,我们调用此表来查找用户的设施和设施用户。

这是我在PHP中的选择查询:

SELECT users.id, users.first, users.last FROM staff_facilities LEFT JOIN users ON staff_facilities.users_id=users.id WHERE staff_facilities.facilties_id=$id ORDER BY users.last

此查询在我们的开发服务器上运行良好,但是当我将其放入客户端的生产环境时,结果集中经常出现空白行。我们的开发服务器使用客户端生产服务器上已存在的复制表和数据,但硬件和软件差别很大。

这些行没有任何信息,包括需要将NOT NULL值输入数据库的三个id字段。通过后端的MySQL管理工具运行查询会返回相同的结果。在表中搜索NULL字段没有显示任何内容。

另一个奇怪的是,空行的数量正在根据WHERE子句id检查引起的变化结果而改变。它通常大约有一到三个空行,但在使用相同参数时它们是一致的。

由于LEFT JOINS,我已多次处理几乎重复行的返回,但我以前从未遇到过这种情况。就显示信息而言,我可以轻松地将其隐藏在最终用户之外。我担心的主要是随着时间的推移,这个问题会变得复杂,而且记录的数量会越来越多。刚好安装了这个系统,我们已经在staff_facilities表中拥有2000多条记录。

任何见解或指示都将受到赞赏。我还可以提供更详细的例子和信息。

1 个答案:

答案 0 :(得分:4)

您只是从联接右侧的表格中选择列。当然其中一些是完全无效的,你做了一个左连接。因此,这些记录与连接左侧表中的id匹配,但不与连接右侧的任何数据匹配。由于您没有从左表中返回任何列,因此您看不到任何数据。