我想在mysql数据库字段中存储一组类别。该字段为varchar,类别将以逗号分隔的方式输入。在添加或更新表单中加载时,应该有一个下拉多项选择类别列表和一个字段,用于输入新的类别或一组以逗号分隔的类别。
所以这里的问题是如何:
使下拉列表只显示每个类别中的一个,即使每行中都有多个类别,例如:
row1: category: entertainment,news,music
row2: category: news,religion,entertainment
row3: category: news,music,religion
,显示的下拉列表应如下所示:
entertainment
news
religion
music
除了下拉列表中的选择外,还允许用户向数据库添加新类别。
可能有更好的方法可以做到这一点,但由于我对php / mysql不是很有经验,所以我不确定如何。我尝试将类别列添加到数据库中作为类型SET或在PHPMyAdmin中键入ENUM但是无论我做了什么我都得到错误1064,所以我放弃并决定只使用逗号分隔文本。我相信我需要使用explode和implode php函数来存储这些数据。目前,只有一个类别的文本字段,但这不会保护用户免受可能由于现有类别的拼写错误而导致出现额外类别的拼写错误。
答案 0 :(得分:0)
嗯,我猜你在数据库模式上错了。这是典型的1对n关系,所以通常你应该拥有的是:
[分类表]
[内容表](包含要分类的数据的表)
你有一张桌子加入这两个并允许多种关系。
[Content_Belongs_To_Category表]
现在,您在“类别”表上执行选择以获取下拉列表所需的列表,并且对于内容所属的每个类别,您可以在关系表中添加一行。
您最终可以使用[Categories Table]和[Content_Belongs_To_Category Table]加入[Content Table]以获取项目所属的类别列表(作为数组,或者您可以使用GROUP_CONCAT将它们作为逗号分隔的字符串)
可能在我的答案中可能有太多未知术语,但它应该让你开始整理(正确:))。
编辑:示例SQL语句
SELECT * FROM Categories
SELECT * FROM Content_Belongs_To_Category cbtc INNER JOIN类别c ON cbtc.categoryId = c.categoryId WHERE cbtc.contentId =
选择co.contentId,min(co.name)作为名称,group_concat(c.name)作为类别 来自内容公司 LEFT OUTER JOIN Content_Belongs_To_Category cbtc ON cbtc.contentId = co.contentId LEFT OUTER JOIN类别c ON cbtc.categoryId = c.categoryId GROUP BY co.contentId