[英]How to get the questions and its related tags using store procedure in mysql?
我有一個questions
表
和
一個tags
表
最后是一個question_tags
關系表
我有以下代碼可以使用 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 variables
( eg @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.