Mysql

GROUP CONCAT 和 GROUP BY 使用 LEFT JOIN 如果不存在記錄 必須返回一些東西

  • June 30, 2021

我有 2 個具有以下結構的表。

question桌子

id, audio, s_id
1, ad1, 500
2, ad2, 500
3, ad3, 500

answersq_id的 FK在哪裡question

id, s_id, q_id, number, answer
1, 500, 1, 088888801, 1
1, 500, 3, 088888801, 3
1, 500, 1, 090078601, 2
1, 500, 2, 090078601, 4
1, 500, 3, 090078601, 2

讓我們以這個例子來更好地理解上述結構。

我在 2 個號碼(090078601、088888801)上撥呼叫,他們都接聽了電話。隨叫隨到,總共將播放 3 個問題。可以看到答案表,號碼088888801已經回答了問題1和3,他跳過了第2題,如果使用者跳過一個問題,答案表中將沒有條目。但是號碼 090078601 已經回答了所有 3 個問題。

我想獲取所有記錄,但如果使用者跳過了答案,我想表明這個數字已經跳過了那個問題,這是我的查詢

SELECT r.number, GROUP_CONCAT(COALESCE(r.answer, 'skip')) as answer FROM questions LEFT JOIN  answers ON r.q_id= q.id WHERE q.s_id= 500 group by r.number order by q.id ASC

這個查詢在下面返回我

我真正想要的是

注意:我想要一個優化的查詢,因為可以有大約 24 個問題和超過 200000 個數字,如果每個數字回答 24 個問題,那麼答案表中將有 480 萬條記錄。這僅適用於一個 S_ID,其他 s_id 會有更多記錄,但我只想查詢 s_id,因為 s_id 對於每個執行的調查都是唯一的。

MySQLl 8 和 MariaDB 都不會產生完整的 NULL 行。

As Joins 僅將現有問題連結到答案

但是如果你有這樣的星座,你可以簡單地添加一個額外的 WHERE 子句

CREATE TABLE questions 
    (`id` int, `audio` varchar(3), `s_id` int)
;
    
INSERT INTO questions 
    (`id`, `audio`, `s_id`)
VALUES
    (1, 'ad1', 500),
    (2, 'ad2', 500),
    (3, 'ad3', 500),
    (4, 'ad4', 500)
;
CREATE TABLE answers 
    (`id` int, `s_id` int, `q_id` int, `number` int, `answer` int)
;
    
INSERT INTO answers 
    (`id`, `s_id`, `q_id`, `number`, `answer`)
VALUES
    (1, 500, 1, 088888801, 1),
    (1, 500, 3, 088888801, 3),
    (1, 500, 1, 090078601, 2),
    (1, 500, 2, 090078601, 4),
    (1, 500, 3, 090078601, 2)
;
SELECT 
    r.number, GROUP_CONCAT(COALESCE(r.answer, 'skip')) AS answer
FROM
    questions q
        LEFT JOIN
    answers r ON r.q_id = q.id 
WHERE
    q.s_id = 500
GROUP BY r.number
#ORDER BY q.id ASC
 號碼 | 回答
-------: | :-----
    *空*| 跳過 
88888801 | 3,1 
90078601 | 2,4,2
SELECT 
    r.number, GROUP_CONCAT(COALESCE(r.answer, 'skip')) AS answer
FROM
    questions q
        LEFT JOIN
    answers r ON r.q_id = q.id 
WHERE
    q.s_id = 500 AND r.id IS NOT NULL
GROUP BY r.number
#ORDER BY q.id ASC
 號碼 | 回答
-------: | :-----
88888801 | 3,1 
90078601 | 2,4,2

db<>在這裡擺弄

SELECT  number, 
       ( SELECT GROUP_CONCAT(COALESCE(r2.answer, 'skip')
                             ORDER BY q.id ASC)
               FROM questions q
               LEFT JOIN answers r2  ON r2.q_id = q.id
                                    AND r2.number = r1.number
       ) AS answer
   FROM  answers r1
   GROUP BY number
   ORDER BY number

–>

number      answer
88888801    1,skip,3
90078601    2,4,2

引用自:https://dba.stackexchange.com/questions/294941