Mysql
GROUP CONCAT 和 GROUP BY 使用 LEFT JOIN 如果不存在記錄 必須返回一些東西
我有 2 個具有以下結構的表。
question
桌子id, audio, s_id 1, ad1, 500 2, ad2, 500 3, ad3, 500
answers
表q_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