2010-06-03 2 views
1

Я просил эту последнюю неделю в выходные, и она зарылась в архивах, прежде чем кто-либо мог ответить. Так простите меня, если вы уже это видели.Mysql устранить пользователя на основе условий

Я преподаю классы и хочу иметь возможность выбирать тех студентов, которые взяли один класс, но не другого класса. У меня есть две таблицы: lessons_slots которых является таблица для каждого класса, таких как:

--------------------
-ID имя slots-
-1 основы 10 -
-2 расширенных 10 -
-3 основа 10 -
---------------------

другая таблица является class_roll, в котором содержится информация о регистрации, такая как:

--------------------
-sid ClassID Firstname lastname-
-1 1 Jo Schmo
-2 1 Person Два
...
-13 2 Jo Schmo
---------------------

Что я хочу делать, я выбираю всех, у кого не было продвинутого класса (например). Я пытался делать

SELECT * FROM
lessons_slots
LEFT JOIN class_roll
ON lessons_slots.ID = class_roll.classid
ГДЕ lessons_slots.name! = 'Продвинутыми'

Но что не работает ... Все, что он делает, это исключить эту строку, не исключая пользователя. Я хочу, чтобы Джо Шмо, например, не появлялся в результатах. Есть идеи?

+0

Плохой сложный запрос схемы сложный make. – Dolph

ответ

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

Я получаю сообщение об ошибке: «subquery возвращает более одной строки» – Dustin

+0

Измените <> на не в – Gary

+0

Получил это! Это было прекрасно! (Хотел бы я сначала спросить, прежде чем тратить несколько часов на мой компьютер). – Dustin

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, но не исключит Джо Шмо полностью. – Dustin

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.