通过与单个列值进行多次时间比较来获得结果

时间:2017-01-09 08:16:35

标签: mysql sql

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

我想在一个查询中获取学生列表。

2 个答案:

答案 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,使用HAVINGCOUNT 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