2010-06-03 59 views
1

我上周在周末问了这个问题,在任何人回答之前它都被埋在了档案中。所以如果你已经看到这个,请原谅我。Mysql根据条件消除用户

我教授课程,希望能够选择那些参加过一门课而不是另一门课的学生。我有两个表:lessons_slots这是每一个类,如表:

--------------------
-ID名slots-
-1基础10 -
-2先进10 -
-3基本10 -
---------------------

另一表是class_roll,其中包含注册信息,例如:

--------------------
-sid的classid姓lastname-
-1 1乔Schmo
-2 1人两
...
-13 2 Jo Schmo
---------------------

我想要做的,我选择每个没有高级班的人(例如)。我试着做

SELECT *
FROM lessons_slots
LEFT JOIN class_roll
ON lessons_slots.ID = class_roll.classid
WHERE lessons_slots.name!= '先进'

但是,不起作用......它所做的就是消除该行,而不会消除用户。例如,我想让Jo Schmo在结果中不显示。有任何想法吗?

+0

可怜的模式复杂查询困难。 – Dolph 2010-06-03 14:57:46

回答

0

不漂亮,但工程。

SELECT c.* 
FROM lessons_slots l 
join class_roll c on l.id=c.classid 
where concat(firstname,lastname) not in (select concat(firstname,lastname) 
from lessons_slots l 
join class_roll c on l.id=c.classid where name='advanced') 
+0

我收到一个错误,说“子查询返回多行” – Dustin 2010-06-03 15:32:01

+0

更改<>不在 – Gary 2010-06-03 15:41:14

+0

明白!这做得很好! (我希望在花几个小时在我的电脑上发誓之前先问过)。 – Dustin 2010-06-03 16:40:23

0
SELECT * FROM class_roll cl LEFT JOIN lessons_slots ls 
ON cl.classid = ls.id AND ls.name != 'advanced' 

所以你真的想删除行?那么:

DELETE FROM class_roll cl LEFT JOIN lessons_slots ls 
ON cl.classid = ls.id AND ls.name != 'advanced' 
+0

这与我原来的查询有相同的问题......它消除了行而不消除用户。所以...它会摆脱sID 13,但不会完全消除Jo Schmo。 – Dustin 2010-06-03 15:26:02

0

你可以尝试的东西的

SELECT FirstName, LastName FROM class_roll 
WHERE NOT EXISTS 
    (SELECT * FROM class_roll, lesson_slots 
    WHERE class_roll.classid = lesson_slots.ID 
    AND lesson_slots.name = 'advanced') 

的效果,然后可以使用结果作为DELETE查询的基础。