Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在mysql中使用存储过程获取问题及其相关标记?_Php_Mysql_Database_Stored Procedures_Tags - Fatal编程技术网

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]。这个查询不能满足您的需要吗?非常感谢您花时间回答。我认为表结构还可以。因为它是多对多关系。这就是处理多对多关系的方式。不用担心。