![](/img/trans.png)
[英]How to get two values from table based on different id's in same SELECT
[英]How to select values from table based on field with the same id?
假設我有以下 sql 表:
表“學生”
ID | 名 | 姓 |
---|---|---|
1個 | 莉蓮 | 需要 |
2個 | 威廉 | 洛倫茲 |
3個 | 瑪麗 | 摩爾 |
4個 | 吉賽爾 | 柯林斯 |
5個 | 詹姆士 | 莫爾特里 |
6個 | 約翰 | 羅德里格斯 |
表“ exam_result ”:
exam_result_id | 主題編號 | 學生卡 | 標記 |
---|---|---|---|
1個 | 2個 | 1個 | 49 |
2個 | 2個 | 2個 | 21 |
3個 | 1個 | 3個 | 81 |
4個 | 4個 | 1個 | 33 |
5個 | 4個 | 2個 | 19 |
6個 | 3個 | 2個 | 46 |
7 | 1個 | 5個 | 55 |
8個 | 3個 | 5個 | 75 |
9 | 2個 | 5個 | 60 |
11 | 1個 | 6個 | 86 |
12 | 2個 | 6個 | 92 |
13 | 3個 | 6個 | 48歲 |
14 | 4個 | 6個 | 78 |
我需要 select 所有考試成績 <50 或根本沒有參加任何考試的學生。
因此,在這種情況下,我需要 ID 為 1、2 和 4 的學生。
我想到的最接近的是以下查詢,但它給出了 ID 為 1、2、4 和 6 的學生。我不需要 ID 為 6 的學生,因為他只有 1 次考試不及格,而不是全部。
SELECT DISTINCT s.id, s.first_name, s.last_name
FROM university.student s
LEFT JOIN
university.exam_result er ON
s.id = er.student_id
WHERE er.mark < 50 OR er.mark IS NULL;
我需要它在 PostgreSQL 和 MariaDB 中工作,所以我不想要任何特定於它們的東西。
有效的查詢是:
SELECT DISTINCT s.id, s.first_name, s.last_name
FROM university.student s
WHERE NOT EXISTS(SELECT 1 FROM university.exam_result er WHERE s.id = er.student_id AND er.mark > 49);
謝謝@jarlh 的評論。
我會結合檢查標記使用 NOT EXISTS 條件
select s.*
from student s
where not exists (select *
from exam_result er
where er.student_id = s.id)
or 50 >= all (select er.mark
from exam_result er
where er.student_id = s.id)
一種選擇是通過聚合來做到這一點,方法是確保小於 50 的標記數等於它們的所有標記數。 當學生的分數為 0 分時,條件仍然滿足。
SELECT s.id, s.first_name, s.last_name
FROM student s
LEFT JOIN exam_result er ON s.id = er.student_id
GROUP BY s.id, s.first_name, s.last_name
HAVING COUNT(CASE WHEN er.mark < 50 THEN 1 END) = COUNT(er.mark)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.