2016-05-10 4 views
1

Если у меня есть таблица, такие как:выберите запрос -mysql

 name1  | name2  | id  | 
+----------------+--------------+-----------+ 
| A    | E   | 1   | 
| A    | F   | 1   | 
| B    | G   | 1   | 
| C    | H   | 1   | 
| D    | I   | 1   | 
| A    | J   | 2   | 
| B    | K   | 2   | 
| C    | L   | 2   | 
| D    | M   | 2   | 
| A    | N   | 2   | 

то, что мне нужно, что выбрать все строки идентификатора, где name2 <> «E»

Если я:

selete * from table where name2 <> 'E' 

Это только дает мне этот

 name1  | name2  | id  | 
+----------------+--------------+-----------+ 
| A    | F   | 1   | 
| B    | G   | 1   | 
| C    | H   | 1   | 
| D    | I   | 1   | 
| A    | J   | 2   | 
| B    | K   | 2   | 
| C    | L   | 2   | 
| D    | M   | 2   | 
| A    | N   | 2   | 

В результате я хочу это (за исключением все строки идентификатора, который содержит Имя2 = «Е», по крайней мере один раз):

 name1  | name2  | id  | 
+----------------+--------------+-----------+ 
| A    | J   | 2   | 
| B    | K   | 2   | 
| C    | L   | 2   | 
| D    | M   | 2   | 
| A    | N   | 2   | 

Какой запрос я должен использовать?

ответ

5

Один подход заключается в использовании подзапроса, который находит все идентификаторы, которые имеют значение 'E' в колонке name2, а затем отфильтровать все эти идентификаторы:

SELECT * 
FROM table 
WHERE id NOT IN 
    (SELECT DISTINCT id FROM table WHERE name2 = 'E') 
+1

Обратите внимание, что если в таблице есть строка с идентификационным значением NULL и значением name2 'E', этот запрос будет возвращать нулевые строки. – spencer7593

1

SELECT * FROM table WHERE ID NOT IN (SELECT ID FROM table WHERE name2 <> 'E')

1

Мы можем использовать анти-присоединиться к схеме:

SELECT t.name1 
    , t.name2 
    , t.id 
    FROM mytable t 
    LEFT 
    JOIN mytable q 
    ON q.id = t.id 
    AND q.name2 = 'E' 
WHERE q.id IS NULL 

Операция левого внешнего соединения говорит о возврате всех строк от t вместе с соответствующими строками от q. Трюк - это условие в предложении WHERE. Для любых строк, которые нашли совпадающую строку в q, значение q.id не должно быть NULL (из-за сравнения равенства). Строки из t, у которых не было соответствующей строки, будут иметь значение NULL для q.id. Таким образом, это возвращает только строки из t, у которых не было соответствующей строки от q.

Смежные вопросы