簡體   English   中英

如何在mysql中使用存儲過程獲取問題及其相關標簽?

[英]How to get the questions and its related tags using store procedure in mysql?

我有一個questions

  1. ID
  2. 標題
  3. 身體


一個tags

  1. ID
  2. 姓名
  3. 描述

最后是一個question_tags關系表

  1. ID
  2. tag_id
  3. 問題編號


我有以下代碼可以使用 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 variableseg @prev and @c )。 問題 ID 存儲在 @prev 變量中。 在遍歷questions_tags表中的行時,如果我看到一個新的question_id然后我將變量@c重置為1
  • @c變量為 tags.id 字段分配一個標簽編號,該編號與原始tag_number 由於您告訴過可以有無限多個tags但每個問題最多可以有五個標簽,因此變量@c的范圍將是1 to 5 ie [1,5]
  • 內部查詢生成這個結果集
  • 現在外部查詢開始發揮作用。 在最外面的查詢中有一個group by子句。 因此,您將獲得每個問題的一行。
  • MAX(CASE WHEN t.constantTagNumber = 1 THEN t.name END)這一行的作用是保證第一個標簽描述會放在最終結果集中對應的列中。 這叫做pivoting

請花一些時間查看內部查詢。 然后想想自己“我怎樣才能從這個表中生成最終結果集?”。

如果您需要任何幫助,請隨時詢問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM