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,那是一整罐蠕虫!但是,是的,我将把这个问题的答案也应用到那个专栏上。这是一个很好的观点,但在这个特殊情况下,我更愿意将它作为一个列表(可能会有表被连接的情况等等)好的,那么,换一个新表。如果你在可以将列表存储到一个字段中的时候徘徊,我会说,只有当你不想在该字段上运行查询时,才可以。在你的情况下,这确实是一个禁忌:-)