我有一个 questions
表与
- 编号
- 标题
- 正文
和
tags
表与
- 编号
- 姓名
- 描述
最后是 question_tags
关系表与
- 编号
- tag_id
- question_id
我有以下代码使用 mysql 存储过程获取所有问题。
I need to get the question details and its related tag details using a store procedures (like this
<question details,tag1 details,tag2 details... tag5 details>
).
I thought about storing the tag's id along with the question table ,but for retrieving the tag details I had to write another query which store procedure doesn't allow me to do.Same issue when trying to get tag details after getting the question id.
I tried my level best ,but yet don't know how to solve it.
any ideas or suggestions? thanks
I tried my best to explain the situation .
最佳答案
下面是查找输出结构的基本查询,如下所示:
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 用户变量
(例如@prev 和@c
)。问题 ID 存储在 @prev 变量中。在遍历questions_tags
表中的行时,如果我看到一个新的question_id
然后我将变量@c
重置为1
. @c
变量为 tags.id 字段分配一个标签号,它与原始tag_number
无关。由于您告诉我们可以有无限多个tags
但每个问题最多可以有五个标签,所以变量@c
的范围将是1 到 5
即[1,5]
.- 内部查询生成这个 result set
- 现在外部查询开始发挥作用了。在最外层的查询中有一个
group by
子句。所以每个问题你都会得到一行。 MAX(CASE WHEN t.constantTagNumber = 1 THEN t.name END)
这一行的作用是确保第一个标签描述会被放到最终结果集中对应的列中.这称为旋转
。
请花一些时间查看内部查询。然后自己想一想“我怎样才能从这个表中生成最终结果集?”。
如果您需要任何帮助,请随时提出。
关于php - 如何在mysql中使用存储过程获取问题及其相关标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36362419/