2014-12-25 90 views
1

我試圖從同一屬性列中獲得掌握2個值(MySQL和Python)的eNum(員工編號),我得到的距離最近,但eNum被複制。我只想得到一個eNum。我想我搞亂它在WHERE子句中......我不知道......顯示ID共享來自同一屬性的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和子句... – eneko

1

我認爲這個問題是在設計本身,想起來了,員工可以掌握了衆多包和包可以通過很多員工掌握,這是一個多對多的關係,其中包含每個表

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

的主鍵組成的主密鑰數據庫,這將產生一個表employee_package例如條款那麼你的請求將會是這樣的:

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

y我應該更換in子句,謝謝@axiac – teeyo

相關問題