表 r_job_scores :
Student_id | Skill | skill-Score
1 PHP 5
1 SQL 1
1 HTML 2
1 CSS 2
2 PHP 10
2 SQL 1
3 PHP 3
3 HTML -2
3 CSS 2
我想过滤学生成绩:
SELECT Student_id
FROM r_job_scores
WHERE SKILL = 'PHP' AND MARKS >= 3
AND SKILL = 'HTML' AND MARKS >= 2
AND SKILL = 'CSS' AND MARKS >= 1
AND SKILL = 'SQL' AND MARKS >= 1
我想在一个查询中获取学生列表。
答案 0 :(得分:2)
您的查询存在的问题是,学生在单行上无法满足所有条件,因此您无法获得任何结果。
您可以group by
student_id并使用条件聚合来检查特定条件。这假定student_id每个技能最多有一行。
SELECT Student_id
FROM r_job_scores
GROUP BY Student_id
HAVING SUM(CASE WHEN SKILL = 'PHP' AND MARKS >= 3 THEN 1 ELSE 0 END) = 1
AND SUM(CASE WHEN SKILL = 'HTML' AND MARKS >= 2 THEN 1 ELSE 0 END) = 1
AND SUM(CASE WHEN SKILL = 'CSS' AND MARKS >= 1 THEN 1 ELSE 0 END) = 1
AND SUM(CASE WHEN SKILL = 'SQL' AND MARKS >= 1 THEN 1 ELSE 0 END) = 1
查询也可以简单地在MySQL中表示为
SELECT Student_id
FROM r_job_scores
GROUP BY Student_id
HAVING SUM(SKILL = 'PHP' AND MARKS >= 3) = 1
AND SUM(SKILL = 'HTML' AND MARKS >= 2) = 1
AND SUM(SKILL = 'CSS' AND MARKS >= 1) = 1
AND SUM(SKILL = 'SQL' AND MARKS >= 1) = 1
答案 1 :(得分:2)
执行GROUP BY
,使用HAVING
与COUNT DISTINCT
结合使用,以确保所有4种技能都存在:
SELECT Student_id
FROM r_job_scores
WHERE (SKILL = 'PHP' AND MARKS >= 3)
OR (SKILL = 'HTML' AND MARKS >= 2)
OR (SKILL = 'CSS' AND MARKS >= 1)
OR (SKILL = 'SQL' AND MARKS >= 1)
GROUP BY Student_id
HAVING COUNT(DISTINCT SKILL) = 4