我试图更好地了解联结表和表联接。如果我有两个表, 循环 和 停靠点 ,它们之间存在多对多关系,我按 的顺序显示停靠点吗?
当前,我有两个看起来像这样的平面表。
+----+-------+
| id | loops |
+----+-------+
| 1 | Red |
| 2 | Green |
| 3 | Blue |
+----+-------+
+---------------------+-------+--------------+----+
| stops | loops | displayOrder | id |
+---------------------+-------+--------------+----+
| West Stop | Red | 1 | 12 |
| North Stop | Red | 2 | 43 |
| Building Stop | Red | 3 | 15 |
| Park Stop | Red | 4 | 14 |
| Park Stop | Green | 1 | 42 |
| West Stop | Green | 3 | 11 |
| Building Stop | Green | 2 | 8 |
| Building Stop | Blue | 1 | 2 |
| Park Stop | Blue | 3 | 4 |
| West Stop | Blue | 2 | 6 |
+---------------------+-------+--------------+----+
如果我要过滤停靠点 表中的 停靠点 列,则可以看到有具有多个回路的站点,因为不同的总线回路可以访问这些站点。您会发现每个 循环 的顺序也不同。
+----------+-------+--------------+----+
| stops | loops | displayOrder | id |
+----------+-------+--------------+----+
| WestStop | Red | 1 | 12 |
| WestStop | Green | 3 | 11 |
| WestStop | Blue | 2 | 6 |
+----------+-------+--------------+----+
有没有一种方法可以使用联结表和表联接为特定的 循环 仅获得 个停靠点 强>同时保持其顺序?
This Article讨论了如何创建联结表,但是我仍然不确定如何保持显示顺序,而又没有像现在这样的具有多个循环的多站的丑陋,平坦的数据库。
我也意识到,我应该使用Stops表中的 循环 值作为外键中 循环的外键循环表
答案 0 :(得分:0)
答案 1 :(得分:0)
除非特别说明,否则不能保证表中数据的顺序。
您需要
例如
Loop_ID Stop_ID Order
1 12 1
1 43 2
1 15 3
1 14 4
答案 2 :(得分:0)
公交线路(环路)和公交车站之间有很多关系:使用联结表是标准的出行方式。
在结点表中,loops_stops说,您想要将fk存储到总线线路,将另一个fk存储到公交车站,以及该行的停车顺序。您可以在两个约束列上有一个唯一键(包括顺序,同一行两次可能会出现同一停靠点的情况)。 Nb:在MySQL中,您通常要使用自动递增的整数主键。
在停靠点表中,存储了停靠点常用的信息,例如名称,位置,设备等。
使用联结表是表示数据的正确方法。这也将防止您在行表中复制信息。我们可以看到样本数据开始出现这种情况:如果需要添加所有行共有的信息怎么办?在您的样本数据中(例如位置)?您将需要在每行上复制它,这样效率低下,并且在更新该值时会带来维护麻烦。
答案 3 :(得分:0)
您可以在没有连接表的情况下进行操作,如下所示:
Declare @Loop Table
(Loop_Id int,
Name varchar(50))
Insert into @Loop
Values
(1,'Red'),
(2,'Green'),
(3,'Blue')
Declare @Stop_Table Table
(Stops varchar(500),
Loops varchar(50),
DisplayOrder int,
Id int)
Insert into @Stop_Table
(Stops,Loops,DisplayOrder,Id)
Values
('West Stop' ,'Red' ,'1','12'),
('North Stop' ,'Red' ,'2','43'),
('Building Stop' ,'Red' ,'3','15'),
('Park Stop' ,'Red' ,'4','14'),
('Park Stop' ,'Green' ,'1','42'),
('West Stop' ,'Green' ,'3','11'),
('Building Stop' ,'Green' ,'2','8'),
('Building Stop' ,'Blue' ,'1','2'),
('Park Stop' ,'Blue' ,'3','4'),
('West Stop' ,'Blue' ,'2','6')
--To get all loops sort
select S.*,L.* from @Stop_Table S
Join @Loop L
On L.Name = S.Loops
Order by L.Loop_Id,S.DisplayOrder asc
--To get stops for a specific loop.For Ex:Red
select S.*,L.* from @Stop_Table S
Join @Loop L
On L.Name = S.Loops
where L.Name = 'Red'
Order by L.Loop_Id,S.DisplayOrder asc