Mysql 我可以为连接表中的项目保留订单吗?

Mysql 我可以为连接表中的项目保留订单吗?,mysql,sql,Mysql,Sql,我试图更好地理解连接表和表连接。如果我有两个表,循环和停止,它们具有多对多关系,我如何以各自的顺序显示停止 目前,我有两张这样的平板桌子 循环表 停止表(未排序) 如果我要过滤站点表中的站点列,您可以看到有多个环路的站点,因为不同的公交环路可以访问这些站点。您可以看到,每个循环的顺序也不同 +----------+-------+--------------+----+ | stops | loops | displayOrder | id | +----------+-------+--

我试图更好地理解连接表和表连接。如果我有两个表,循环停止,它们具有多对多关系,我如何以各自的顺序显示停止

目前,我有两张这样的平板桌子

循环表 停止表(未排序) 如果我要过滤站点表中的站点列,您可以看到有多个环路的站点,因为不同的公交环路可以访问这些站点。您可以看到,每个循环的顺序也不同

+----------+-------+--------------+----+
|  stops   | loops | displayOrder | id |
+----------+-------+--------------+----+
| WestStop | Red   |            1 | 12 |
| WestStop | Green |            3 | 11 |
| WestStop | Blue  |            2 | 6  |
+----------+-------+--------------+----+
是否有一种方法可以使用联接表和表联接,在保持其顺序的同时,仅为特定的循环获取停止点

讨论了如何创建连接表,但我仍然不确定如何维护显示顺序,而不会像现在这样有一个丑陋、扁平的数据库,其中包含多个循环的多个停止点

我还知道,我可能应该使用Stops表中的循环值作为loops表中循环的外键创建3个表

循环、停止和一个表来连接它们的路由

您还可以想象一个将站点链接到其他站点的表,该表告诉您站点之间的距离和所需时间。然后,理论上,您可以使用该类型的信息来确定最佳路线。

创建3个表

循环、停止和一个表来连接它们的路由


您还可以想象一个将站点链接到其他站点的表,该表告诉您站点之间的距离和所需时间。理论上,您可以使用该类型的信息来确定最佳路线。

除非指定,否则无法保证表中数据的顺序

你要么

  • 添加一个排序列
  • 按循环、显示顺序或id排序
  • 创建联接表并向联接表中添加排序列
比如说

Loop_ID Stop_ID Order
1         12      1
1         43      2
1         15      3
1         14      4

除非另有规定,否则不保证表中数据的顺序

你要么

  • 添加一个排序列
  • 按循环、显示顺序或id排序
  • 创建联接表并向联接表中添加排序列
比如说

Loop_ID Stop_ID Order
1         12      1
1         43      2
1         15      3
1         14      4

在公交线路(环路)和公交车站之间存在多对多关系:使用连接表是标准方式

在“连接表”中,表示要将一个fk存储到公交线路,另一个fk存储到公交车站,以及线路的车站顺序。在两个约束列上可以有一个唯一的键(包括同一行可能为同一个停止服务两次的顺序)。注意:在MySQL中,您通常希望使用自动递增的整数主键

在“站点”表中,您存储站点常用的信息,如名称、位置、设备等


使用连接表是表示数据的正确方法。它还将防止您复制行表中的信息。我们可以看到,您的示例数据开始出现这种情况:如果您需要添加所有行都通用的信息,该怎么办?在您的样本数据中(例如位置)?您需要在每一行上复制它,这是不高效的,当您需要更新该值时,这是一个维护噩梦。

公交线路(环路)和公交车站之间存在多对多关系:使用连接表是标准方法

在“连接表”中,表示要将一个fk存储到公交线路,另一个fk存储到公交车站,以及线路的车站顺序。在两个约束列上可以有一个唯一的键(包括同一行可能为同一个停止服务两次的顺序)。注意:在MySQL中,您通常希望使用自动递增的整数主键

在“站点”表中,您存储站点常用的信息,如名称、位置、设备等


使用连接表是表示数据的正确方法。它还将防止您复制行表中的信息。我们可以看到,您的示例数据开始出现这种情况:如果您需要添加所有行都通用的信息,该怎么办?在您的样本数据中(例如位置)?您需要在每一行上复制它,这是不高效的,并且在需要更新该值时是维护的噩梦。

您可以在没有连接表的情况下执行此操作,如下所示:

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

您可以在不使用连接表的情况下执行此操作,如下所示:

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

更新您的问题并添加预期结果。too3表。。停,停,停。您可以在loop_stop中设置一列,以告知停止的顺序并添加您的问题和预期结果。too3表。。停,停,停。您可以在loop_stop中有一列来告诉停止的顺序,除非有一个排序列,否则该列对订单没有帮助,除非有一个排序列