如何查找具有另一行的所有值的所有行

时间:2014-08-08 08:40:08

标签: mysql

我的数据库包含studentsmarks个表格,您可以访问这些表格http://www.sqlfiddle.com/#!2/817367/1。查询应该返回所有已经获得所有标记的学生已经获得了学生的答案。 (1,2,3),即 - b,e,f

我已经解决了问题部分让所有学生。name有任何标记。score其中有学生。name =' c'但我可以&# 39;弄清楚如何强制检查所有标记。score - ' c'。

...希望问题很清楚。

提前致谢。

3 个答案:

答案 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)

得到它......嗯,你的要求很奇怪,但是这可以通过单个输入'c'给你所需要的东西

也许还有改进的空间,但此时你就是自己。

不知怎的,我无法更新小提琴,所以这里是

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