[英]How to combine rows from two tables into a single table based on Foreign key, in MySQL.?
我在 MySQL 中有 2 個表,如下所示:
+------+-------+------------------+
| ID | Q_ID |Question |
+------+-------+------------------+
|1 | 1 |Colors in Rainbow |
|2 | 2 |Colors in Tree |
+------+-------+------------------+
+------+-------+--------+
| ID | Q_ID |Answer |
+------+-------+--------+
|1 | 1 |Violet |
|2 | 1 |Blue |
|3 | 1 |Yellow |
|4 | 2 |Brown |
|5 | 2 |Orange |
|6 | 2 |Green |
+------+-------+--------+
Q_Id是鏈接兩個表的字段。 每個 Q_id恰好有 3 個選項作為答案。
現在,我想在 MySQL 中編寫一個查詢,將下表提供為 output 。
+------+--------------------+----------+----------+----------+
| Q_ID | Question |Answer 1 |Answer 2 |Answer 3 |
+------+--------------------+----------+----------+----------+
| 1 | Colors in Rainbow |Violet |Blue |Yellow |
| 2 | Colors in Tree |Brown |Orange |Green |
+------+--------------------+----------+----------+----------+
我怎么做。?
如果它們都是這種情況,那么您可以在這里使用簡單的CASE WHEN
和MAX
組合。
SELECT Q_ID ,QUESTION,
MAX(CASE WHEN MOD(ID,3)=1 THEN ANSWER END) AS ANS1,
MAX(CASE WHEN MOD(ID,3)=2 THEN ANSWER END) AS ANS2,
MAX(CASE WHEN MOD(ID,3)=0 THEN ANSWER END) AS ANS3
FROM
(WITH TAB1 AS
(
SELECT 1 AS ID, 1 AS Q_ID , 'Colors in Rainbow' AS QUESTION UNION ALL
SELECT 2 AS ID, 2 AS Q_ID , 'Colors in Tree' AS QUESTION
),
TAB2 AS (
SELECT 1 AS ID , 1 AS Q_ID, 'Violet' AS ANSWER UNION ALL
SELECT 2 AS ID , 1 AS Q_ID, 'Blue ' AS ANSWER UNION ALL
SELECT 3 AS ID , 1 AS Q_ID, 'Yellow' AS ANSWER UNION ALL
SELECT 4 AS ID , 2 AS Q_ID, 'Brown ' AS ANSWER UNION ALL
SELECT 5 AS ID , 2 AS Q_ID, 'Orange' AS ANSWER UNION ALL
SELECT 6 AS ID , 2 AS Q_ID, 'Green ' AS ANSWER
)
SELECT TAB2.ID,TAB1.Q_ID,TAB1.QUESTION,TAB2.ANSWER FROM TAB1 INNER JOIN TAB2 ON TAB2.Q_ID=TAB1.Q_ID
) A
GROUP BY Q_ID ,QUESTION
編輯:
正如stickybit所說,我的第一個答案存在缺陷。 為了擺脫這個缺陷,我使用了ROW_NUMBER
。 此編輯由來自stickybit 的指導進行。 感謝您的意見。 (窗口功能僅適用於 mysql 8.0 或以上版本。)
SELECT Q_ID ,QUESTION,
MAX(CASE WHEN MOD(RN,3)=1 THEN ANSWER END) AS ANS1,
MAX(CASE WHEN MOD(RN,3)=2 THEN ANSWER END) AS ANS2,
MAX(CASE WHEN MOD(RN,3)=0 THEN ANSWER END) AS ANS3
FROM
(WITH TAB1 AS
(
SELECT 1 AS ID, 1 AS Q_ID , 'Colors in Rainbow' AS QUESTION UNION ALL
SELECT 2 AS ID, 2 AS Q_ID , 'Colors in Tree' AS QUESTION
),
TAB2 AS (
SELECT 1 AS ID , 1 AS Q_ID, 'Violet' AS ANSWER UNION ALL
SELECT 4 AS ID , 1 AS Q_ID, 'Blue' AS ANSWER UNION ALL
SELECT 7 AS ID , 1 AS Q_ID, 'Yellow' AS ANSWER UNION ALL
SELECT 10 AS ID , 2 AS Q_ID, 'Brown' AS ANSWER UNION ALL
SELECT 13 AS ID , 2 AS Q_ID, 'Orange' AS ANSWER UNION ALL
SELECT 16 AS ID , 2 AS Q_ID, 'Green' AS ANSWER
)
SELECT row_number() OVER (PARTITION BY TAB1.Q_ID ORDER BY TAB2.ID) as rn, TAB2.ID,TAB1.Q_ID,TAB1.QUESTION,TAB2.ANSWER FROM TAB1 INNER JOIN TAB2 ON TAB2.Q_ID=TAB1.Q_ID
) A
GROUP BY Q_ID ,QUESTION
一種方法是使用帶有LIMIT
和OFFSET
的子查詢。
SELECT t1.q_id,
(SELECT t2.answer
FROM elbat2 t2
WHERE t2.q_id = t1.q_id
ORDER BY t2.id
LIMIT 1
OFFSET 0) answer1,
(SELECT t2.answer
FROM elbat2 t2
WHERE t2.q_id = t1.q_id
ORDER BY t2.id
LIMIT 1
OFFSET 1) answer2,
(SELECT t2.answer
FROM elbat2 t2
WHERE t2.q_id = t1.q_id
ORDER BY t2.id
LIMIT 1
OFFSET 2) answer3
FROM elbat1 t1;
db<>小提琴
請注意,您需要在此處ORDER BY
一些列,否則無法保證順序,這可能導致某些答案出現多次或根本不出現。
在表answers
中使用group_concat()
以正確順序連接questions
,然后加入使用substring_index()
拆分的問題:
select q.q_id, q.question,
substring_index(all_answers, ',', 1) Answer1,
substring_index(substring_index(all_answers, ',', -2), ',', 1) Answer2,
substring_index(all_answers, ',', -1) Answer3
from questions q inner join (
select q_id, group_concat(answer order by id) all_answers
from answers
group by q_id
) a
on a.q_id = q.q_id
我使用','
作為連接答案的分隔符。
請參閱演示。
如果答案中可能存在','
那么您可以通過在group_concat()
中添加separator '@'
並在substring_index()
中使用'@'
來將其更改為任何其他字符。
請參閱演示。
結果:
| q_id | question | Answer1 | Answer2 | Answer3 |
| ---- | ----------------- | ------- | ------- | ------- |
| 1 | Colors in Rainbow | Violet | Blue | Yellow |
| 2 | Colors in Tree | Brown | Orange | Green |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.