Php 如何在mysql中使用存储过程获取问题及其相关标记?
我有一个Php 如何在mysql中使用存储过程获取问题及其相关标记?,php,mysql,database,stored-procedures,tags,Php,Mysql,Database,Stored Procedures,Tags,我有一个问题表格 身份证 头衔 身体 和 带有标签的表 身份证 名字 描述 最后是一个问题标签关系表 身份证 标签号 问题编号 我有下面的代码来使用mysql存储过程获取所有问题 我需要使用存储过程(如)获取问题详细信息及其相关标记详细信息。 我曾考虑将标签的id与问题表一起存储,但为了检索标签详细信息,我必须编写另一个存储过程不允许我执行的查询。在获取问题id后尝试获取标签详细信息时也存在同样的问题。 我尽了最大努力,但不知道如何解决它。 有什么想法或建议吗?谢谢 我尽力解释情况 下面
问题
表格
带有标签的
表
身份证
名字
描述
最后是一个问题标签
关系表
身份证
标签号
问题编号
我有下面的代码来使用mysql存储过程获取所有问题
我需要使用存储过程(如
)获取问题详细信息及其相关标记详细信息。
我曾考虑将标签的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
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;
看,这个查询中没有GROUPBY
子句。我试图通过此查询实现的目标是:
- 获取所有问题和标签,以便选中所有记录
从
问题\u标签
表格粘在一起,数量不断增加
标签id的排序(由按问题id排序,标签id
子句完成)
- 我使用了两个
mysql用户变量(例如@prev和@c
)。问题ID存储在@prev变量中。在遍历questions\u tags
表中的行时,如果我看到一个新的question\u id
,那么我将变量@c
重置为1
李>
@c
变量为tags.id字段分配一个标签号,该字段与原始的标签号无关。既然你说可以有无限多的标记
,但每个问题最多可以有五个标记,那么变量@c
的范围将是1到5,即[1,5]
- 内部查询生成
- 现在外部查询开始发挥作用。在最外层的查询中有一个
GROUPBY
子句。因此,每个问题只需一行李>
MAX(t.constantTagNumber=1然后t.name END时的情况)
此行的作用是确保第一个标记描述将放在最终结果集中的相应列中。这叫做旋转
请花些时间查看内部查询。然后想一想“我怎样才能从这个表中生成最终结果集?”
如果您需要任何帮助,请随时询问。您最后想做什么?是否要在同一查询中选择所有问题和关联的标记?要求不明确。你能发布一些输入输出示例吗?@Kenyon。我只想像stackoverflow一样显示结果。@1000111,我尽了最大努力解释这种情况。@Sachin,我有理由相信这就是你想要的:你能添加一些描述,让我和其他人都能理解它吗。标记id从0-->无限变化。但是如果标签id仅与1-->5个id值进行比较,它是如何工作的。我是否遗漏了什么?我可以添加解释。但您之前告诉我,您的标签表中最多有5个标签。所以我假设标签id的范围是[1,5]。这个查询不能满足您的需要吗?非常感谢您花时间回答。我认为表结构还可以。因为它是多对多关系。这就是处理多对多关系的方式。不用担心。