2013-09-18 2 views
0

У меня есть это небольшое задание: Найдите те комнаты, в которых есть проекторы, но не доски.mysql query output projector and whiteboard

CREATE TABLE Equipment 
(
room VARCHAR(15), 
type VARCHAR(20) 
); 

INSERT INTO Equipment VALUES ('Dreyer-201','projector'); 
INSERT INTO Equipment VALUES **('Zuse-127','projector');** 
INSERT INTO Equipment VALUES ('Shannon-164','projector'); 
INSERT INTO Equipment VALUES ('Dreyer-201','whiteboard'); 
INSERT INTO Equipment VALUES **('Zuse-127','whiteboard');** 
INSERT INTO Equipment VALUES ('Shannon-164','whiteboard'); 

Это мой ответ:

SELECT DISTINCT room, type 
FROM Equipment 
WHERE type = 'projector' AND NOT type = 'whiteboard' 

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

ответ

0

Попробуйте это одно использование NOT IN() для помещений, которые принадлежат WHITEBOARD

SELECT DISTINCT room, type 
FROM Equipment 
WHERE type = 'projector' AND room 
NOT IN (SELECT `room` FROM Equipment WHERE type = 'whiteboard') 
0

Самосоединения может работать гораздо лучше, чем решения с использованием GROUP BY или подзапросов.

SELECT e.room, e.type 
FROM Equipment AS e 
LEFT OUTER JOIN Equipment AS e2 
ON e.room = e2.room AND e2.type = 'whiteboard' 
WHERE e.type = 'projector' 
AND e2.type IS NULL; 

Для получения лучших результатов наведите указатель на команду (type,room).