Mysql 标记数据库模式

Mysql 标记数据库模式,mysql,sql,join,aggregate,concat,Mysql,Sql,Join,Aggregate,Concat,我有三张桌子要贴标签。第一个是问题表,它有一个具有特定ID的问题列表。第二个是标记表,它有一个具有特定ID的标记名列表。第三个是问题标记表,它是标记的问题集合。有多个标记的问题意味着问号中有多行,我曾想过将序列化数组存储到问号标记表中,但通常在SQL数据库中存储数组不是一个好主意 下面是模式。表示外键的箭头 ------------------- ----------------- | question_tag | | q

我有三张桌子要贴标签。第一个是问题表,它有一个具有特定ID的问题列表。第二个是标记表,它有一个具有特定ID的标记名列表。第三个是问题标记表,它是标记的问题集合。有多个标记的问题意味着问号中有多行,我曾想过将序列化数组存储到问号标记表中,但通常在SQL数据库中存储数组不是一个好主意

下面是模式。表示外键的箭头

                       -------------------
-----------------      | question_tag    |      
| question      |      -------------------        ------------------
-----------------      | question_tag_ID |        | tag            |
| question_ID   | ---> | question_ID     |        ------------------
-----------------      | tag_ID          | <----- |  tag_ID        |
                       -------------------        |  tag_name      |
                                                  ------------------
如何进行此查询?我考虑过从问题中选择并从标签中加入一个临时表SELECT tag.tag\u name from tag,其中question\u tag.tag\u ID=tag.tag\u ID,但如何像上面的表一样输出这个右列tag\u name

如果您能帮助我完成这个SQL查询,我会非常感激。我猜我需要对正确的tag\u name列执行嵌套选择查询,然后将其连接到question\u表。但我不知道如何处理SELECT查询的嵌套

这就是我想到的:


选择*从问题作为Q左连接从标记作为T选择T.tag\u name,其中T.tag\u id在选择QT.tag\u id从问题作为QT,其中QT.question\u id=Q.id作为QT\u T

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

更新

虽然我没有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;

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

标记大多是多态关系。您使用的是哪种数据库管理系统?博士后?Oracle?嘿,neovee,我们需要知道您正在使用什么数据库系统来帮助您进行查询。我为我创建的应用程序使用了相同的模式,但它在SQL server中。请让我们知道。对不起,我忘了提到我使用了MySQL,代码与SQL server有很大不同吗?或者至少你使用的概念在任何地方都适用?也许我可以在MySQL中解决这个问题,请参见下面的更新。这完全是其他参考资料,还没有经过测试。你现在如何使用neovee的SQL Server?@a_horse_和_no_的名字可能没有。我真正的答案不是链接,而是可以查找的过程。当提供更多信息时,我会更新我的答案。@Bizorke我按照你的建议做了。GROUP_CONCAT函数正是我所需要的
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;