链接表和SQL SELECT查询

时间:2012-03-08 14:10:45

标签: php mysql

我的自定义论坛中有一些链接表:categoriessub_categoriesposts

基本上,我有人能够在发布新帖子时最多添加三个类别和五个子类别。

我还让人们“倾听”某些类别和子类别,并将它们放在页面侧面易于访问的栏中。

我的表格因此设置(仅显示相关字段):

帖子:

id              INT
category_id     VARCHAR(12)
sub_category_id VARCHAR(35)

类:

id      INT
name    VARCHAR(20)

- 行业标准:

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]格式存储,我需要根据子类别字段{{1}检查值}。

我尝试了以下内容:

id

但它没有用。我不知道我的查询中是否有错误,或者它是否应该有效,但如果有人能告诉我如何操作或我的代码出错,我将不胜感激!

NB。我试图找出哪些"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基于人们在帖子中一起标记它们。

1 个答案:

答案 0 :(得分:3)

你面临的问题是因为你不了解数据库中的一些概念......

在您的情况下,您想要创建名为“多对多”的关联。 这意味着一个类别可以在很多帖子中使用,一个帖子可以用很多类别来表示。

要将其转换为“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)

我认为您需要在进入项目之前阅读网络上有关数据库的一些文章;)