php - 如何在mysql中使用存储过程获取问题及其相关标签?

标签 php mysql database stored-procedures tags

我有一个 questions表与

  1. 编号
  2. 标题
  3. 正文


tags表与

  1. 编号
  2. 姓名
  3. 描述

最后是 question_tags关系表与

  1. 编号
  2. tag_id
  3. 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;

======>DEMO HERE<======

解释:

先看内部查询:

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;

DEMO OF IT

请看,此查询中没有 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/

相关文章:

php - 如何避免在 mysql 中同时选择第一行?

c# - 基于本地文件的 SQL Server

php - OOP选择数据mysql

php - 跨 3 个表的复杂多重联接查询

java - 在 SQL 中计算百分比

mysql - NodeJS 等待/异步与嵌套的 MySQL 查询

java - Hibernate - 检索所有表信息 - 列名、索引、长度并填充为表

java - 甲骨文数据库 : DBMS_ALERT usage with java application

php - php 或 sql 查询中的子字符串

php - 两个计数之间的差异