簡體   English   中英

如何在 MySQL. 中基於外鍵將兩個表中的行組合成一個表?

[英]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 WHENMAX組合。

工作解決方案

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

在此處輸入圖像描述

一種方法是使用帶有LIMITOFFSET的子查詢。

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.

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