2012-07-15 142 views
0

我有一个包含三个表的数据库:questions,tags和questions_tags。这是他们如何设置:SQL Inner Join和Repeater

--------- 
questions 
--------- 
Question_ID 
Question_Title 
Content 

---- 
tags 
---- 
Tag_ID 
Tag_Title 

-------------- 
questions_tags 
-------------- 
Question_ID 
Tag_ID 

在我的程序中,我使用中继器来显示Question_Title和内容。我希望能够重复Tag_Title(尽管有很多标签也存在一定的问题)

本质上,我试图重新创建类似于stackoverflow的问题块(与问题,标签,视图等)

假设我有一个5个标签的问题,该问题被插入到问题表中,连同一个ID(自动增量)和问题的内容,然后,如果用户附加了任何标签,那么这些标签将被放入带关联ID的标签表中,然后questions_tags表将与Question_ID和Tag_ID匹配,因此它可能类似于:

Question_ID | Tag_ID 
    1  | 3 
    1  | 4 

所以问题1在这个例子中有两个标签。 那么,我该如何让中继器在问题表中重复每个问题,然后重复与该问题相关的每个标签?

我创建了一个视图迄今其内部连接的问题,标签和questions_tags,但重复它只是重复一个问题不止一次......

以下是我曾经为参加完成:

SELECT q.Question_ID, qt.Tag_ID, t.Tag_Title, q.Question_Title, q.Content, q.Views 
FROM questions q 
INNER JOIN questions_tags qt 
ON q.Question_ID = qt.Question_ID 
Inner JOIN tags t 
ON qt.Tag_ID = t.Tag_ID 

或者,换句话说,我怎么可能创建一个视图与我的加入,使得它创建类似这样的表格?:

Question_ID | Tag1 | Tag2 | Tag1_Title | Tag2_Title | Question_Title | Content 
+0

所以你基本上想创建一个视图? – JackyBoi 2012-07-15 23:19:04

+0

是的,在我的帖子末尾有一个视图设置,所以我可以轻松地用我的转发器重复它。 – 2012-07-15 23:20:51

+1

您无法真正创建这样的视图,因为不能保证每个问题的标签数量相同,因此列数相同。我的应用程序中不使用中继器,因此我无法专门回答如何使用中继器执行此操作,但我会采用的方式是将数据加载到结构化的类层次结构中(问题包含标记的集合),然后根据需要呈现该层次结构(即单独呈现标记)。 – 2012-07-15 23:23:29

回答

0

所以以后审查的所有提出的各种建议,我决定去与将数据加载到一个结构化的类层次结构的competent_tech的答案。我已经为问题和标签制作了一个类,其中一个问题类的参数是一个标签列表。通过这条路线,我避免了需要创建任何视图,并且能够使用我的问题中最初陈述的表格。

谢谢大家的帮助。

0

我从你了解什么问题是THA你试图平息问题和标签之间的关系。如果你使用的是mysql(假设你用mysql标记了你的问题),那么你可以使用mysql的GROUP_CONCAT函数。像下面的东西应该会给你你正在寻找的东西。

SELECT q.Question_ID, q.Question_Title, GROUP_CONCAT(t.Tag_Title SEPARATOR ', ') AS 'Tags' 
FROM questions q 
INNER JOIN questions_tags qt 
ON q.Question_ID = qt.Question_ID 
INNER JOIN tags t 
ON qt.Tag_ID = t.Tag_ID 
GROUP BY q.Question_ID, q.q.Question_Title 

输出看起来应该像下面这样:

id  title tags 
1  quest1 tag1, tag2, tag3 
2  myquest anotherTag, anotherTag2 
+0

这种方法的问题是,您从结果中丢失了Tag_ID,如果它们提供超链接来定义标记或悬停时的工具提示,则可能需要这些Tag_ID。 – 2012-07-15 23:38:47

+0

@competent_tech,这就是问题所在,我需要这个Tag_ID,以便我可以在链接中使用它。 – 2012-07-15 23:40:33

+0

您可以更改适合需要的格式。如果它需要是一个链接,它可以在SQL中生成,如:GROUP_CONCAT(Concat('http ....',t.Tag_ID,'...',Tag_Title)...) – loopedcode 2012-07-15 23:40:38