2014-12-04 6 views
2

Я понимаю, что это, вероятно, очень просто. Просто опоздать и нужно объяснение.SQL найти одно значение из дубликатов с определенным условием

У меня есть таблица:

mysql> SELECT * FROM employee_expert; 
+------+---------+ 
| enum | package | 
+------+---------+ 
| E246 | Excel | 
| E246 | MySQL | 
| E246 | Python | 
| E246 | Word | 
| E403 | Java | 
| E403 | MySQL | 
| E892 | Excel | 
| E892 | PHP  | 
| E892 | Python | 
+------+---------+ 
9 rows in set (0.00 sec) 

И мне нужно найти enum кортежа НЕ Python Результат должен быть E403, так как его единственный не с Python.

Пробовал

mysql> SELECT enum FROM employee_expert WHERE package != "Python" GROUP BY enum; 
+------+ 
| enum | 
+------+ 
| E246 | 
| E403 | 
| E892 | 
+------+ 
3 rows in set (0.00 sec)   

Но, очевидно, он просто вернул все enum сек ...

ответ

2

Одним из вариантов является not in оператор:

SELECT DISTINCT enum 
FROM employee_expert 
WHERE enum NOT IN (SELECT enum 
        FROM employee_expert 
        WHERE package = 'Python') 
+0

ДА. Большое спасибо. Пробовал NOT IN, но не с подзапросом. –

+0

(На правильно проиндексированной таблице это самый медленный из 3 представленных решений) – Strawberry

2

NOT IN исключит подмножество данных с определенными критериями исключения:

SELECT DISTINCT(enum) 
FROM employee_expert 
WHERE enum NOT IN 
(SELECT enum FROM employee_expert WHERE package = 'Python'); 

Distinct исключает дубликаты. Sql Fiddle here

+1

Спасибо за помощь. Может принимать только 1. Не могу сказать, первым ли вы или Мурейник ответил. –

1
SELECT DISTINCT x.enum 
      FROM employee_expert x 
      LEFT 
      JOIN employee_expert y 
      ON y.enum = x.enum 
      AND y.package = 'Python' 
      WHERE y.enum IS NULL; 
2

Я думаю, что NOT EXISTS может быть быстрее, чем NOT IN

SQL Fiddle

MySQL 5.5.32 Схема установки:

CREATE TABLE employee_expert 
    (`enum` varchar(4), `package` varchar(6)) 
; 

INSERT INTO employee_expert 
    (`enum`, `package`) 
VALUES 
    ('E246', 'Excel'), 
    ('E246', 'MySQL'), 
    ('E246', 'Python'), 
    ('E246', 'Word'), 
    ('E403', 'Java'), 
    ('E403', 'MySQL'), 
    ('E892', 'Excel'), 
    ('E892', 'PHP'), 
    ('E892', 'Python') 
; 

Запрос 1:

SELECT DISTINCT enum 
FROM employee_expert ee1 
WHERE NOT EXISTS 
(SELECT 1 
FROM employee_expert ee2 
WHERE ee1.enum = ee2.enum AND ee2.package = 'Python') 

Results:

| ENUM | 
|------| 
| E403 | 
+0

Да, я тоже так думаю. – Strawberry

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