3个表之间的链接显示1条记录而不是254条记录

时间:2015-05-19 07:28:08

标签: php mysql sql

我需要了解一些关于MySQL链接的事情。 有我暴露的问题:

我在IT支持服务部​​工作,我正在制作一个IP管理网站托管面板。

这是我的表格: tables

这是我的代码

SELECT *
FROM IP
    INNER JOIN VLAN ON IP.GATEWAY = VLAN.GATEWAY
    INNER JOIN SCHOOLBUILDING ON VLAN.SCHOOLBUILDING = SCHOOLBUILDING.NAME
    INNER JOIN SCHOOL ON SCHOOLBUILDING.SCHOOLNAME = SCHOOL.NAME
WHERE SCHOOL.NAME = 'mySchoolName'

当我运行此操作时,我只获得了1条记录,这是表IP的最后一条。

我深深地暴露了我的问题:

仪表板页面,您选择城市的一部分
dashboard

学校建筑选择页面
school

VLAN选择
VLAN Selection

2 个答案:

答案 0 :(得分:0)

您在VLAN和IP之间的联接不正确,字段名称为IP_GATEWAY,而不仅仅是GATEWAY

SELECT *
FROM IP i
INNER JOIN VLAN v ON I.IP_GATEWAY = V.IP_GATEWAY
INNER JOIN SCHOOLBUILDING SB ON V.SCHOOLBUILDING = SB.NAME
INNER JOIN SCHOOL S ON SB.SCHOOLNAME = S.NAME
WHERE S.NAME = 'mySchoolName'

此外,如果此仍然不起作用,那么我将FULL OUTER JOINS用于所有这些并向后工作。

SELECT *
FROM IP i
FULL OUTER JOIN VLAN v ON I.IP_GATEWAY = V.IP_GATEWAY
FULL OUTER JOIN SCHOOLBUILDING SB ON V.SCHOOLBUILDING = SB.NAME
FULL OUTER JOIN SCHOOL S ON SB.SCHOOLNAME = S.NAME
WHERE S.NAME = 'mySchoolName'

答案 1 :(得分:0)

你可能想要OUTER而不是INNER连接: 即使没有VLAN / IP,此特定学校的所有详细信息。

SELECT *
FROM IP
    RIGHT JOIN VLAN ON IP.GATEWAY = VLAN.GATEWAY
    RIGHT JOIN SCHOOLBUILDING ON VLAN.SCHOOLBUILDING = SCHOOLBUILDING.NAME
    RIGHT JOIN SCHOOL ON SCHOOLBUILDING.SCHOOLNAME = SCHOOL.NAME
WHERE SCHOOL.NAME = 'mySchoolName'

由于大多数人更喜欢LEFT联接(更容易理解,因此从最重要的表开始):

SELECT *
FROM SCHOOL
LEFT JOIN SCHOOLBUILDING 
  ON SCHOOLBUILDING.SCHOOLNAME = SCHOOL.NAME
LEFT JOIN VLAN
  ON VLAN.SCHOOLBUILDING = SCHOOLBUILDING.NAME
LEFT JOIN IP
  ON IP.GATEWAY = VLAN.GATEWAY
WHERE SCHOOL.NAME = 'mySchoolName'