我有一个带有的questions
表
- id
- 所有权
- 车身
和
具有的tags
表
- id
- 名称
- 说明
最后是一个带有的question_tags
关系表
- id
- tag_id
- 问题id
我有下面的代码来获得使用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
(e.g. @prev and @c
)。问题ID存储在@prev变量中。在遍历questions_tags
表中的行时,如果我看到新的question_id
,则我将变量@c
重置为1
@c
变量为tags.id字段分配一个与原始tag_number
无关的标签号。因为你告诉过可以有无限多个tags
,但每个问题最多可以有五个标签,所以变量@c
的范围将是1 to 5
i.e. [1,5]
- 内部查询生成此结果集
- 现在,外部查询开始发挥作用。在最外层的查询中有一个
group by
子句。所以每个问题你都会得到一行 MAX(CASE WHEN t.constantTagNumber = 1 THEN t.name END)
此行的作用是确保第一个标签描述将被放在最终结果集中的相应列中。它被称为pivoting
请花一些时间查看内部查询。然后想想自己"我如何才能从这个表中生成最终结果集?"。
如果你需要任何帮助,请随时询问。