标记数据库架构

时间:2014-03-14 20:33:43

标签: mysql sql join aggregate concat

我有三个用于标记的表。第一个是question表,其中包含具有特定ID的问题列表。第二个是tag表,其中包含具有特定ID的标记名称列表。第三个是question_tag表,一个标签问题的集合。有多个标记的问题意味着question_tag中的多行,我想到将序列化数组存储到question_tag表中,但一般来说,将数组存储在SQL中并不是一个好主意数据库中。

以下是架构。箭头表示外键。

                       -------------------
-----------------      | question_tag    |      
| question      |      -------------------        ------------------
-----------------      | question_tag_ID |        | tag            |
| question_ID   | ---> | question_ID     |        ------------------
-----------------      | tag_ID          | <----- |  tag_ID        |
                       -------------------        |  tag_name      |
                                                  ------------------

我想创建一个将在下面输出此表的查询。

----------------------------------------------------
| question_id | tag_name                           |
----------------------------------------------------
| 1           | algebra, calculus, differentiation |
| 2           | calculus                           |
| 3           | algebra, trigonometry              |
----------------------------------------------------

如何设法执行此查询?我想过从questionJOINING选择一个SELECT tag.tag_name FROM tag WHERE question_tag.tag_ID = tag.tag_ID的临时表,但是如何输出这个RIGHT列(tag_name),如上表所示。

如果你能帮我解决这个SQL查询,我真的很感激,我猜我需要为RIGHT(tag_name)列做一个嵌套SELECT查询,然后将它加入到question_table中。但我不确定如何嵌套SELECT查询。

这就是我的想法:

SELECT * FROM question as Q LEFT JOIN (SELECT T.tag_name FROM tag as T WHERE T.tag_id IN (SELECT QT.tag_id FROM question_tag AS QT WHERE QT.question_ID = Q.id)) AS QT_T

1 个答案:

答案 0 :(得分:1)

您需要聚合和连接。请查看一些相关问题:

Does T-SQL have an aggregate function to concatenate strings?

Implode type function in SQL Server 2000?

Concatenate row values T-SQL

How to use GROUP BY to concatenate strings in MySQL?

Aggregate String Concatenation in Oracle 10g

Create a delimitted string from a query in DB2

How to concatenate strings of a string field in a PostgreSQL 'group by' query?

<强>更新

虽然我没有一个mysql数据库来测试这个,但是从上面的一个链接开始(知道这是mysql),我设计了以下查询:

SELECT 
    qt.question_id, 
    GROUP_CONCAT(t.tag_name SEPARATOR ',') 
FROM question_tag qt
LEFT JOIN tag t ON t.tag_id = qt.tag_id
GROUP BY qt.question_id;

请尝试一下,让我知道它是否有效。