繁体   English   中英

如何在mysql中使用存储过程获取问题及其相关标签?

[英]How to get the questions and its related tags using store procedure in mysql?

我有一个questions

  1. ID
  2. 标题
  3. 身体


一个tags

  1. ID
  2. 姓名
  3. 描述

最后是一个question_tags关系表

  1. ID
  2. tag_id
  3. 问题编号


我有以下代码可以使用 mysql 存储过程获取所有问题。

我需要使用存储过程获取问题详细信息及其相关标签详细信息(例如<question details,tag1 details,tag2 details... tag5 details> )。
我想过将标签的 id 与问题表一起存储,但是为了检索标签详细信息,我必须编写另一个查询,哪个存储过程不允许我这样做。在获取问题 id 后尝试获取标签详细信息时存在同样的问题。
我尽力了我的水平,但不知道如何解决它。
有什么想法或建议吗? 谢谢
我尽力解释情况。

这是找出输出结构的基本查询,如下所示:

 question_id    title   FirstTagName    FirstTag    SecondTagName   SecondTag   ThirdTagName    ThirdTag    FourthTagName   FourthTag   FifthTagName    FifthTag

询问:

SELECT 
t.question_id,
t.title,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.name END) AS FirstTagName,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.description END) AS FirstTag,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.name END) AS SecondTagName,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.description END) AS SecondTag,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.name END) AS ThirdTagName,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.description END) AS ThirdTag,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.name END) AS FourthTagName,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.description END) AS FourthTag,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.name END) AS FifthTagName,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.description END) AS FifthTag
FROM
(
    SELECT
        question_id,
        questions.title,
        tag_id,
        tags. NAME,
        tags.description,
        IF (@prev = question_id ,@c := @c + 1,@c := 1) constantTagNumber,
        @prev := question_id
    FROM    (   SELECT @prev := 0 ,@c := 1) var,    questions_tags
    INNER JOIN tags ON tags.id = questions_tags.tag_id
    INNER JOIN questions ON questions_tags.question_id = questions.ID
    ORDER BY    question_id,    tag_id
) t
GROUP BY t.question_id;

======>演示在这里<======

解释:

先看内部查询:

SELECT
            question_id,
            questions.title,
            tag_id,
            tags. NAME,
            tags.description,
            IF (@prev = question_id ,@c := @c + 1,@c := 1) constantTagNumber,
            @prev := question_id
        FROM    (   SELECT @prev := 0 ,@c := 1) var,    questions_tags
        INNER JOIN tags ON tags.id = questions_tags.tag_id
        INNER JOIN questions ON questions_tags.question_id = questions.ID
        ORDER BY    question_id,    tag_id;

它的演示

看看这个查询中没有group by子句。 我试图通过这个查询实现的是:

  • 获取所有问题和标签,以便从questions_tags表中选择的所有记录粘在一起,并具有越来越多的tag ids (由ORDER BY question_id,tag_id子句完成)
  • 我使用了两个mysql user variableseg @prev and @c )。 问题 ID 存储在 @prev 变量中。 在遍历questions_tags表中的行时,如果我看到一个新的question_id然后我将变量@c重置为1
  • @c变量为 tags.id 字段分配一个标签编号,该编号与原始tag_number 由于您告诉过可以有无限多个tags但每个问题最多可以有五个标签,因此变量@c的范围将是1 to 5 ie [1,5]
  • 内部查询生成这个结果集
  • 现在外部查询开始发挥作用。 在最外面的查询中有一个group by子句。 因此,您将获得每个问题的一行。
  • MAX(CASE WHEN t.constantTagNumber = 1 THEN t.name END)这一行的作用是保证第一个标签描述会放在最终结果集中对应的列中。 这叫做pivoting

请花一些时间查看内部查询。 然后想想自己“我怎样才能从这个表中生成最终结果集?”。

如果您需要任何帮助,请随时询问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM