如何在MySQL数据库中显示多个值?

时间:2009-10-20 03:46:45

标签: sql mysql

我想知道如何在数据库中显示多个值,例如,假设您有一个用户将填写一个表单,要求他们输入他们喜欢的食物类型,例如饼干,糖果,苹果,面包等。

如何将它存储在名为food的同一字段下的MySQL数据库中?

野外食物结构如何?

4 个答案:

答案 0 :(得分:4)

您可能需要阅读the excellent Wikipedia article on database normalization

您不希望在单个字段中存储多个值。你想做这样的事情:

form_responses
    id
    [whatever other fields your form has]

foods_liked
    form_response_id
    food_name

其中form_responses是包含单数事物的表(如人的姓名或地址,或者没有多个值的事物)。 foods_liked.form_response_id是对form_responses表的引用,因此响应数为6的人喜欢的食物对form_response_id中的foods_liked字段的值为6。对于每个人喜欢的食物,你会在该表中排成一行。

编辑:其他人建议使用三表结构,如果限制用户从预定义列表中选择食物,这肯定会更好。在你允许他们输入自己的食物的情况下,三桌结构可能会更好,但是如果你走这条路线你会想要小心你的输入正常化(修剪空白,修复大写等等)。 )所以你不会在那个表中找到重复的条目。

答案 1 :(得分:2)

通常,我们不会这样做。尝试使用关系表。

表1:tbl_food

ID    primary key, auto increment
FNAME varchar

表2:tbl_user

ID   primary key, auto increment
USER varchar

表3:tbl_userfood

RID      auto increment
USERID   int
FOODID   int

使用类似的格式存储您的数据,而不是将一大块数据放入字段中。

查询这些表比解析数据块更容易。

答案 2 :(得分:1)

使用标准化。

更具体地说,创建一个名为users的表。创建另一种叫做食物。然后将这两个表与一个名为users_to_foods的多对多表连接在一起,引用彼此的外键。

答案 3 :(得分:0)

一种方法是用您的编程语言序列化食物数据,然后将其存储在食物领域。这将允许您查询数据库,获取序列化的食物数据,并使用您的编程语言将其转换回本机数据结构(在本例中可能是一个数组)。

这种方法的问题在于,您将反复存储大量相同的数据,例如:如果很多人喜欢cookies,字符串“cookies”将被反复存储。另一个问题是寻找喜欢某种特定食物的每个人。为此,您必须为每条记录选择食物数据,对其进行反序列化,并查看所选食物是否包含在其中。这是非常低效的。

相反,您需要创建3个表:用户表,食物表和连接表。用户和食物表将分别包含每个用户和食物的一条记录。联接表将包含两个字段:user_idfood_id。对于用户选择的每种食物,它会在用户ID和食物ID的连接表中添加记录。

例如,为了吸引所有喜欢ID为FOOD_ID的特定食物的用户,您的查询将是:

SELECT users.id, users.name
FROM users, join_table
WHERE join_table.food_id = FOOD_ID
AND join_table.user_id = users.id;