Php 在MySQL中存储逗号分隔的数据
我已经读到这是一个否定,但我想知道是否总是这样。我有一张可以容纳一排座位的“餐桌”列表。Php 在MySQL中存储逗号分隔的数据,php,mysql,database,Php,Mysql,Database,我已经读到这是一个否定,但我想知道是否总是这样。我有一张可以容纳一排座位的“餐桌”列表。 您可以在图中看到,表_num 12可容纳2或3个座位 所以,现在我的解决方案是查询所有的表记录(根据用户索引,原因不明),然后循环搜索结果,寻找可以容纳3个人的表(如果恰好有3个人在寻找一个表) 我通过在返回数据的“seats”列上使用array_introde()方法(在php中)来实现这一点。我觉得这比创建一个单独的“座位”表,然后为每个座位分配一个表索引和用户索引,然后运行第二个查询以在原始“表”表
您可以在图中看到,表_num 12可容纳2或3个座位 所以,现在我的解决方案是查询所有的表记录(根据用户索引,原因不明),然后循环搜索结果,寻找可以容纳3个人的表(如果恰好有3个人在寻找一个表) 我通过在返回数据的“seats”列上使用array_introde()方法(在php中)来实现这一点。我觉得这比创建一个单独的“座位”表,然后为每个座位分配一个表索引和用户索引,然后运行第二个查询以在原始“表”表中查找表编号更简单
基本上,通过使用array_introde()我可以绕过第二个查询。但是,我不知道这样做是否更省钱。或者,我可能错过了一些很棒的查询语言(比如关系表行话?创建一个名为
TableSeats
的表。在其中,您将有一个table_num
和一个seats
列。使用table_num
列作为外键。然后,要找到能坐3个人的桌子,应该是这样的:
select
*
from
tables t
where
exists (select 1 from tableseats s where s.seats = 3)
这里的魔力在于
exists
子句。当然,您也可以进行内部联接
,但我建议您在此处使用exists
,因为这样您就可以通过说where s.seats>=7来查找至少可以容纳7人的任何表,甚至一张可以容纳5到8人的桌子,其中s.的座位在5到8人之间,如果我错了,请纠正我,但这听起来并不是一个列表。它更像是一个系列(从2个座位到3个座位)。因此,通过将seats
字段替换为minu_seats
和max_seats
字段,可以获得更好的结构。如果您从此表中删除了seats
列,然后有一个新的seats
表,该表有三列:id
、table\u index
和num\u seats
,其中table\u index
与现有表中的index
相关(多对一,因为座位中的每个桌子可能有多个实体)。您可以这样选择所需的桌子:
SELECT tables.* FROM tables
INNER JOIN seats ON tables.index = seats.table_index
WHERE seats.num_seats = ?
那么,外键是自动填充的吗?@Jascha-Nope,它所做的只是确保在table_num
中填充的值必须存在于Tables
table中。您需要手动或一次性编程加载填充该表。看起来join方法最适合这种特殊情况我不想让两个人坐在一张6人桌上的例子。我在问题中没有提到这一点……我感觉很糟糕,但有人用join方法(和示例)回答了我的问题特别是,我觉得我必须给他打勾。不过我确实给了你一个要点。只是好奇。为什么一张能坐3个座位的桌子不能总是能坐2个座位?换句话说,为什么这个列不能被称为max\u seats
?@webbiedave,这不是一个真实的例子。原因是会有一张能坐2个座位的桌子吃5或6个人,但我们不希望有2个人坐在那里,一个“最大座位”会在该表中分配不需要的人数。还有一些其他情况与组合表编号有关。如果您想在组合字段中找到包含10个的记录,会发生什么?如果您保存组合数据,则不需要第二次查询第二张桌子,只是加入你的query@MarkBaker,那是一整罐蠕虫!但是,是的,我将把这个问题的答案也应用到那个专栏上。这是一个很好的观点,但在这个特殊情况下,我更愿意将它作为一个列表(可能会有表被连接的情况等等)好的,那么,换一个新表。如果你在可以将列表存储到一个字段中的时候徘徊,我会说,只有当你不想在该字段上运行查询时,才可以。在你的情况下,这确实是一个禁忌:-)