我的数据库包含students
和marks
个表格,您可以访问这些表格http://www.sqlfiddle.com/#!2/817367/1。查询应该返回所有已经获得所有标记的学生已经获得了学生的答案。 (1,2,3),即 - b,e,f 。
我已经解决了问题部分让所有学生。name
有任何标记。score
其中有学生。name
=' c'但我可以&# 39;弄清楚如何强制检查所有标记。score
- ' c'。
...希望问题很清楚。
提前致谢。
答案 0 :(得分:1)
另一个类似的解决方案:
SELECT s2.name
FROM marks m1
JOIN marks m2 ON m2.score = m1.score
JOIN students s1 ON s1.id = m1.s_id
JOIN students s2 ON s2.id = m2.s_id
WHERE s1.name = 'c' AND s2.name != 'c'
GROUP BY s2.id
HAVING COUNT(DISTINCT m1.score)
= (SELECT COUNT(DISTINCT m.score)
FROM marks m
JOIN students s ON s.id = m.s_id
WHERE s.name = 'c')
答案 1 :(得分:1)
其他解决方案目前还不错,但是如果你想要一个不使用像“COUNT”这样的聚合函数的解决方案,那就考虑一下。 http://www.sqlfiddle.com/#!2/817367/39
SELECT `name`
FROM students
JOIN (SELECT DISTINCT s_id
FROM marks AS marks1
WHERE marks1.`s_id` NOT IN(
SELECT DISTINCT marks2.s_id
FROM (SELECT score
FROM marks
JOIN students ON marks.`s_id` = students.`id`
AND students.`name` = 'c') AS c_scores
CROSS JOIN marks AS marks2
ON marks2.`s_id` NOT IN (
SELECT s_id
FROM marks
JOIN students ON marks.`s_id` = students.`id`
AND students.`name` = 'c')
LEFT JOIN marks AS marks3 ON marks3.`s_id` = marks2.s_id
AND marks3.`score` = c_scores.score
WHERE marks3.`s_id` IS NULL
)) AS good_ids
ON students.`id` = good_ids.s_id
WHERE `name` != 'c'
答案 2 :(得分:0)
也许还有改进的空间,但此时你就是自己。
不知怎的,我无法更新小提琴,所以这里是
select t1.name
from
(select s1.name,count(*) as count
from marks m1
inner join marks m2 using (score)
inner join students s1 on (s1.id=m2.s_id)
inner join students s2 on (m1.s_id=s2.id)
where s2.name='c'
group by m2.s_id
) as t1
JOIN
(select count(*) as min_count
from marks m
inner join students s on (m.s_id=s.id)
where s.name='c'
) as t2
where
t1.name != 'c'
and t1.count >= t2.min_count