我的自定义论坛中有几个链接表:categories
、sub_categories
和posts
基本上,我让人们在发布新帖子时最多可以添加三个类别和五个子类别。
我还使人们能够"收听"某些类别和子类别,并将它们放在页面侧面易于访问的栏中。
我的表格是这样设置的(为了方便起见,只显示相关字段(:
职位:
id INT
category_id VARCHAR(12)
sub_category_id VARCHAR(35)
类别:
id INT
name VARCHAR(20)
sub_categories:
id INT
name VARCHAR(20)
在我的posts
表中,我按 ID 以以下格式存储集合类别和子类别:
category_id [2][4][8]
sub_category_id [1][2][3][4][5]
从而使我能够在PHP中执行以下查询并根据类别和子类别获取帖子:
SELECT * FROM posts WHERE category_id LIKE '%[{$id}]%' AND sub_category_id LIKE '%[{$id2}]%'
我遇到的问题是为人们"收听"的访问栏选择sub_categories
......
$sql = "SELECT title, id FROM categories";
$query = mysql_query($sql);
$list = array();
while ($row = mysql_fetch_assoc($query)){
$list[$row['title']] = array();
$sql = "SELECT sub_categories.title FROM sub_categories, posts WHERE (category_id LIKE '%[{$row['id']}]%') AND (????) LIMIT 0,100";
$query = mysql_query($sql);
while($result = mysql_fetch_assoc($query)){
$list[$row['title']][] = $result['title'];
}
}
print_r($list);
显然,您可以看到我卡在(????)
的地方,但在我解释我想要做什么之前,我将解释我正在寻找的输出是什么。
当我打印$list
数组时,我希望它打印一个多维数组,其中类别作为第一个键,其值是已在主类别中标记的子类别数组。
我遇到的问题是,在帖子表上的sub_category_id
字段中,请记住值以[1][2][3]
格式存储,我需要根据子类别字段id
检查值。
我尝试了以下方法:
"SELECT sub_categories.title FROM sub_categories, posts WHERE (category_id LIKE '%[{$row['id']}]%') AND (sub_category_id LIKE '%[sub_categories.id]%') LIMIT 0,100"
但它没有用。我不知道我的查询中是否有错误,或者它是否应该工作,但如果有人能告诉我如何做或我的代码哪里出错,我将不胜感激!
铌。我试图根据人们在帖子中一起标记它们来查找哪些sub_categories
出现在哪个categories
中。
您面临问题是因为您不知道数据库中的一些概念...
在您的情况下,您希望创建称为"多对多"的关联。这意味着一个类别可以在许多帖子中使用,一个帖子可以由许多类别表示。
要将其转换为"SQL"世界,您必须创建一个中间表。
此表将存储两个表的两个标识符。
例如:
-------------------
| categorisation |
-------------------
| post_id | => is the link to posts
| category_id | => is the link to categories
-------------------
创建新帖子时,会在表帖子中创建新对象。但是,您还会在表分类中创建 N 条记录。
当您想要检索应用于此帖子的类别时,您可以执行如下查询:
SELECT post.id, post.name
FROM post
INNER JOIN categorisation on (post.id = categorisation.post_id)
INNER JOIN category ON (categorisation.category_id = category.id)
我认为在进行项目;)之前,您需要阅读网络上有关数据库的一些文章