2012-03-08 63 views
1

我有我的自定义论坛的几个链接表:categoriessub_categoriesposts链接表和SQL SELECT查询

基本上,我已经能够添加三个类别和五个子类别的人,当他们做出最新帖子。

我还可以让人们'听'某些类别和子类别,并让他们在页面的一侧方便访问栏。

我的表被设置从而(仅示出了用于便于relavent字段):

帖子:

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],我需要检查该值与子类别字段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基于人们在帖子中标记他们在一起。

回答

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) 

我认为你需要在你进步项目之前,了解数据库在网络上的一些文章; )

+0

......我简直不敢相信。我实际上使用这个确切的解决方案来存储用户最喜欢的类别和子类别......出于某种原因,我完全忘记了它,因为我专注于问题,而不是解决方案! – 2012-03-08 14:34:11

+0

还有一个提示:您可以为类别和子类别设置一个表格,其中包含“id”,“parent_id”(NULLABLE)和“name”列。这样,您还可以强制执行每个子类别与其父类别之间的关系。 – bfavaretto 2012-03-08 14:34:17

+0

由于我正在建设的论坛的性质,子类别可以属于多个类别。这是漫画,动漫和日本文化,包括粉丝小说和粉丝艺术,所以基本上,有人可能喜欢漫画(即火影忍者)并写下“粉丝小说”。火影忍者也是动画片!我非常松散地使用术语“子类别”! – 2012-03-08 14:42:14