[英]How to get the questions and its related tags using store procedure in mysql?
我有一个questions
表
和
一个tags
表
最后是一个question_tags
关系表
我有以下代码可以使用 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 variables
( eg @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.