SQL内部联接和转发器

时间:2012-07-15 23:14:20

标签: c# mysql sql repeater inner-join

我有一个包含三个表的数据库:questions,tags和questions_tags。这就是它们的设置方式:

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

----
tags
----
Tag_ID
Tag_Title

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

在我的程序中,我使用转发器来显示Question_Title和Content。我希望能够重复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

2 个答案:

答案 0 :(得分:0)

我从您那里了解到的问题是,您试图平衡问题与标签之间的关系。如果您正在使用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

答案 1 :(得分:0)

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

谢谢大家的帮助。