我正在尝试创建一个Web索引。我的数据库中的每个广告客户都可以在几个类别中展示,因此我添加了categorys
列,在该列中,我将存储以“,”分隔的类别,因此它将如下所示: / p>
1,3,5
问题在于我不知道我应该如何选择某个类别中的所有广告客户,例如:mysql_query("SELECT * FROM advertisers WHERE category = ??");
答案 0 :(得分:3)
如果categories
是另一个数据库表,则不应使用这样的纯文本字段。为此目的创建一个“数据透视表”,类似advertisers_categories
将两个表链接在一起。使用安装程序,您可以执行以下查询:
SELECT A.* FROM advertisers AS A
JOIN advertisers_categories AS AC ON AC.advertiser_id = A.id
WHERE AC.category_id = 12;
advertisers_categories
的架构看起来像这样:
# advertisers_categories
# --> id INT
# --> advertiser_id INT
# --> category_id INT
答案 1 :(得分:1)
您应该以另一种方式设计数据库。看看Atomicity 简短:您不应以1,3,5。
的形式存储您的值我不会给你一个答案,因为如果你开始使用它现在,你会遇到更严重的问题以后。没有冒犯:)
答案 2 :(得分:1)
在SQL查询中严格执行此操作不可能使用逗号分隔值。您可以返回每个行并使用PHP脚本遍历每一行,使用explode($row,',')
然后if(in_array($exploded_row,'CATEGORY'))
检查是否存在该类别。
更常见的解决方案是重构数据库。你的想法太过于二维。您正在寻找Many to Many Data Model
advertisers
-----------
id
name
etc.
categories
----------
id
name
etc.
ad_cat
------
advertiser_id
category_id
因此,ad_cat每个广告客户至少会有一个(通常更多)条目,每个类别至少有一个(通常更多)条目,而ad_cat中的每个条目都会将一个广告客户与一个类别相关联。
SQL查询然后涉及使用所需的category_id从ad_cat获取每一行,并搜索其id在结果查询输出中的广告商。
答案 3 :(得分:0)
您的实施将使您的服务器资源变得困难并且无法按照自己的意愿行事。
我建议创建一个表格,将广告客户与类别相关联,然后在给定类别ID值的情况下查询该表格,以获取该类别中的广告客户。
答案 4 :(得分:0)
这是一种非常错误的方式来定义类别,因为您的值数组无法规范化。 相反,定义另一个名为CATEGORIES的表,并使用JOIN表将CATEGORIES与ADVERTIZERS匹配。
只有这样你才能正确选择它。
希望这有帮助!