2014-12-25 6 views
1

Я пытаюсь получить eNum (номер сотрудника) того, кто владеет 2 значениями (MySQL и Python) из того же столбца атрибута. Ближайшее я получаю ниже, но eNum дублируется. Я хочу получить только один eNum один раз. Я думаю, что я Мессинг его в предложении WHERE ... Я не знаю ...Идентификатор идентификатора обмена 2 значения от одного и того же атрибута

mysql> select * from employee_expert; 

+------+---------+ 
| eNum | package | 
+------+---------+ 
| E246 | Excel | 
| E246 | MySQL | 
| E246 | Python | 
| E246 | Word | 
| E403 | Jave | 
| E403 | MySQL | 
| E892 | Excel | 
| E892 | PHP  | 
| E892 | Python | 
+------+---------+ 




     mysql> SELECT eNum, package 
     FROM employee_expert 
     WHERE (package = 'MySQL' OR package = 'Python') AND (package = 'MySQL' OR package = 'Python') 
     GROUP BY package; 



+------+---------+ 
| eNum | package | 
+------+---------+ 
| E246 | MySQL | 
| E246 | Python | 
+------+---------+ 

ответ

2

В статьях WHERE содержится ненужное дублирование состояния package = 'MySQL' OR package = 'Python'. Достаточно использовать WHERE (package = 'MySQL' OR package = 'Python'). Или, чтобы сделать его более читаемым, вы можете написать WHERE package IN ('MySQL', 'Python').

Ваш запрос выбирает сотрудников, которые знают «MySQL» или «Python» или оба.

Похоже, что вы хотите, чтобы выбрать сотрудников, которые знают Оба «MySQL» и «Python». Вы должны использовать JOIN для этой цели:

SELECT f.eNum 
FROM employee_expert f      # 'f' from 'first' 
    INNER JOIN employee_expert s USING(eNum) # 's' from 'second' 
WHERE f.package = 'MySQL' 
    AND s.package = 'Python' 

К сожалению, этот подход не очень хорошо масштабируется, если вам нужно найти более большим набором языков. Лучше было бы использовать исходный запрос и сгруппировать результаты по eNum так:

SELECT eNum, COUNT(DISTINCT package) AS nbLangs 
FROM employee_expert 
WHERE package IN ('MySQL', 'Python') # <------------------------------------+ 
GROUP BY eNum   # Make one entry for each employee     | 
HAVING nbLangs = 2  # Replace '2' with the number of items in this list --+ 

Этот запрос подсчитывает количество известных языков для всех сотрудников, которые знают по крайней мере один из языков в затем сохраняет только те, кто знает все из них.

+0

Большое спасибо! Я думаю, мне нужно немного вникать в JOIN и clause ... – eneko

1

Я думаю, что проблема заключается в самой конструкции, задумайтесь об этом, работник может освоить МНОГО пакеты и пакет может быть освоен многими сотрудниками, это отношения многие ко многим, с точки зрения базы данных, которая будет производить таблицу employee_package, например, который содержит первичный ключ, состоящий из первичного ключа каждой таблицы

+------+------------+ 
| eNum | package_id | 
+------+------------+ 
| E246 | 1   | 
| E246 | 2   | 
| E246 | 3   | 
| E892 | 1   | 
+------+------------+ 

то ваш запрос будет примерно таким:

SELECT DISTINCT e.eNum from employees e JOIN employee_package ep on ep.eNum = e.eNum 
WHERE ep.package_id = 1 OR ep.package_id = 2 
-- let's say that id 1 is for MySQL and id 2 is for Python 
+1

В этом запросе выбираются сотрудники, которые знают по крайней мере один из языков из списка. OP хочет выбрать сотрудников, которые знают оба языка (или, по крайней мере, так я понимаю вопрос). – axiac

+0

Да, это правильно – eneko

+0

yup Возможно, я должен заменить предложение, спасибо @axiac – teeyo

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