mysql - 标签数据库架构

标签 mysql sql join aggregate concatenation

我有三个用于标记的表。第一个是 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              |
----------------------------------------------------

我如何设法执行此查询?我考虑过 SELECTING from questionJOINING 一个 SELECT tag.tag_name FROM tag WHERE Question_tag.tag_ID = tag.tag_ID 的临时表,但是如何我是否像上表一样输出这个右列(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

最佳答案

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

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;

请尝试一下,如果有效请告诉我。

关于mysql - 标签数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415220/

相关文章:

mysql - 如何从 MySQL 表中获取所有评论

sql - 删除用于测试套件的所有数据库记录的最佳方法是什么?

sql - LibreOffice calc 到 PGAdmin 3?

mysql - 使用 case 语句从 SELECT 更新记录。 (mysql)

MySQL 多重计数和多重连接

node.js 加入 - 来自 php implode

php - postman 发布请求返回 null

mysql - 从第二个连接错误更新字段 x

sql - 当另一列具有匹配值时,选择一列中具有最大值的行

mysql - 从基于同一相关表的行中选择多个列