SQL - 指定关系但仍然有太多记录?

时间:2014-05-02 00:47:30

标签: php sql phpmyadmin

我是SQL编码的新手。我有4个表,我想将公司名称与路由ID组合在一起。我正在尝试使用/更改下面的代码,但是我得到了太多的记录,并且它错误地将所有公司名称与路由ID混合在一起。

SELECT Latitude, Longitude, RouteName, CompanyName
FROM STOP 
INNER JOIN RouteStop 
ON Stop.Stop_ID = RouteStop.Stop_ID 
INNER JOIN Route
ON RouteStop.Route_ID = Route.Route_ID
INNER JOIN Company
ON Route.Company_ID = Company.Company_ID
WHERE RouteStop.Route_ID = 1
AND Company.Company_ID = 1

这是来自SQLfiddle的图片

enter image description here

And a link to my SQLfiddle here

我希望仅使用此代码返回3条记录,因为第一个巴士公司(WHERE RouteStop.Route_ID = 1)的路线1(AND Company.Company_ID = 1)应该只有三站。

我在设计数据库时一定出错了,因为公司1的路由1假设有3条记录,而公司2的路由1假设有10条记录。但是使用我的SQL代码,我得到13条记录,而不是公司1的3条记录。

填写我的路线表时,我在这里使用了这段代码:

INSERT INTO `Route` (`Route_ID`, `Company_ID`, `RouteNum`, `RouteName`) VALUES
(1, 1, 1, 'Corning Community College'),
(2, 1, 2, 'East Corning and Gibson'),
(3, 1, 3, 'Northside'),
(4, 1, 4, 'Southside'),
(5, 1, 5, 'Coopers Plains, Gang Mills, and Painted Post'),
(6, 2, 1, 'Elmira to Corning'),
(7, 2, 2, 'Southtown route'),
(8, 2, 3, 'St. Joe’s Loop'),
(9, 2, 4, 'Bulkhead'),
(10, 2, 5, 'Arnot Loop'),
(11, 2, 6, 'Golden Glow Drive'),
(12, 2, 7, 'Lake Road'),
(13, 2, 8, 'Shopper Shuttle');

我认为可以通过Company_ID划分不同的唯一停靠点和路线...有没有人可以解决我的问题?感谢所有人和任何帮助!

1 个答案:

答案 0 :(得分:3)

这个sql对我来说是正确的。

公司标识1(“CEATS”)在路线ID 1(“康宁社区学院”)的路线表中有记录。

路由1在RouteStop表中有13条记录。

你得到的是来自Stop表的纬度和经度,通过id将路径1中的停靠点链接到RouteStop表,将Route Stop链接到Route 1上的Route表,这样就可以显示Route Name,并通过公司表将ID表和公司名称链接到公司表,并显示公司名称。

由于路线ID 1和公司ID 1中有13个站点,因此返回了13条记录。

我注意到的一件事是停止47& 50并停止48& 49具有相同的经度和纬度(和停止名称)。因此,这导致了这是否是坏数据的问题。康宁社区学院和康宁交通中心的停靠表中有两条记录。

如问题评论中所述,添加DISTINCT将限制返回的数据,但似乎Stop表中存在一些重复数据。

实际上,运行此sql将显示停止表中有5个重复记录:

SELECT stopname, count(*)
from stop
group by stopname
having count(*) > 1