我有一個應用程式,學生可以從串列中選擇第 1、第 2 和第 3 個選項。
表 1 是他們可以選擇的串列:
| ID | 天 |
|---|---|
| 1 | 周一 |
| 2 | 今日 |
| 3 | 周三 |
表2是他們填寫的選擇:
| ID | 第一選擇 | 第二選擇 | 第三選擇 |
|---|---|---|---|
| 12345 | 1 | 3 | 2 |
| 23456 | 3 | 2 | 1 |
| 34567 | 2 | 1 | 3 |
| 45678 | 1 | 2 | 3 |
我正在努力解決的是我想計算每天的選擇和優先級以獲得這樣的串列:
| ID | 第一選擇 | 第二選擇 | 第三選擇 |
|---|---|---|---|
| 周一 | 2 | 1 | 1 |
| 今日 | 1 | 2 | 1 |
| 周三 | 1 | 1 | 2 |
SELECT a.day, count(b.first_choice), count(c.second_choice), count(d.third_choice) FROM table1 a LEFT JOIN table2 b ON a.id = b.first_choice LEFT JOIN table2 c ON a.id = c.second_choice LEFT JOIN table2 d ON a.id = d.third_choice GROUP BY a.day
但是,這樣做我最終得到了這個
| ID | 第一選擇 | 第二選擇 | 第三選擇 |
|---|---|---|---|
| 周一 | 2 | 2 | 2 |
| 今日 | 2 | 2 | 2 |
| 周三 | 2 | 2 | 2 |
有人可以幫我查詢嗎?提前致謝
uj5u.com熱心網友回復:
在這些表結構中,我通常使用子查詢而不是聯接。
SELECT
a.day,
(SELECT COUNT(*) FROM Table2 WHERE first_choice = a.id) AS first_choice,
(SELECT COUNT(*) FROM Table2 WHERE second_choice = a.id) AS second_choice,
(SELECT COUNT(*) FROM Table2 WHERE third_choice = a.id) AS third_choice
FROM Table1 a
uj5u.com熱心網友回復:
您可以使用單個INNER JOIN并使用條件IF陳述句來解決:
SELECT
Table1.id,
Table1.day,
COUNT(IF(Table2.first_choice=Table1.id, Table2.first_choice, NULL)) AS first_choice,
COUNT(IF(Table2.second_choice=Table1.id, Table2.second_choice, NULL)) AS second_choice,
COUNT(IF(Table2.third_choice=Table1.id, Table2.third_choice, NULL)) AS third_choice
FROM
Table1
INNER JOIN
Table2
ON
Table1.id = Table2.first_choice
OR
Table1.id = Table2.second_choice
OR
Table1.id = Table2.third_choice
GROUP BY
Table1.id,
Table1.day
參考這個小提琴:https ://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=eea27fe9364c0fe4b96a846c9441f723
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460377.html
上一篇:如何在下一個最高鍵值上合并資料幀
