2014-12-02 111 views
0

我在過濾SQL時遇到問題。請看看數據庫的架構。現在SQL中的高級過濾器

enter image description here

,我想獲得誰知道PHP搭配技巧●●/●●●和Java與技能●●●程序員。我執行以下查詢:

SELECT p.name, p.city FROM programmers p INNER JOIN skills s 
ON p.id = s.programmer 
WHERE (s.lang = 'PHP' AND s.level > 1) OR (s.lang = 'Java' AND s.level = 3); 

我得到了什麼是

  • 約書亞,亞特蘭大(因爲Java = 3)
  • 約書亞,亞特蘭大(因爲PHP> 1)
  • 克里斯托弗,芝加哥(因爲PHP> 1)

但是克里斯托弗不知道Java,但他被退回。替換ORAND之間的主要條件,因爲沒有返回。

此外,我想獲得一行程序員的所有技能;這裏約書亞在兩個不同的行。如何解決它?

所有事情都考慮過了,最後的問題。如何獲得:

  • 程序員技能PHP●●/●●●,●●●JS和HTML●/●●/●●●
  • 程序員技能PHP●●/●●●和PHP經驗2年以上和JS●●●與經驗4年以上
  • 程序員技能PHP●/●●/●●●和JS●●●在兩個至少3年以上經驗/任何

希望這是可能的。提前致謝。


編輯 業務集中在日期都沒有問題,也沒有必要計算日期之間的差值,SQL可以只包含一年,即2010年一般的日期是不是重點。

+0

@Matt,我知道什麼是'OR',我猜數據庫模式可能是錯誤的 – 2014-12-02 16:14:19

+0

Christopher可能不知道Java,但他確實知道Python,他會知道'OR'的意思是OR – Matt 2014-12-02 16:14:31

+0

好吧,評論一定已經被削減;) – 2014-12-02 16:20:35

回答

2

這是「set-set-sets」問題的一個例子。我想解決這些使用聚合和having

SELECT p.name, p.city 
FROM programmers p INNER JOIN 
    skills s 
    ON p.id = s.programmer 
GROUP BY p.name, p.city 
HAVING SUM(s.lang = 'PHP' AND s.level > 1) > 0 AND 
     SUM(s.lang = 'Java' AND s.level = 3) > 0; 

編輯:

如果你想要的技能列表(這是不是原來的問題的一部分),然後使用group_concat()

SELECT p.name, p.city, group_concat(s.lang, ':', s.level separator '; '); 
FROM programmers p INNER JOIN 
    skills s 
    ON p.id = s.programmer 
GROUP BY p.name, p.city 
HAVING SUM(s.lang = 'PHP' AND s.level > 1) > 0 AND 
     SUM(s.lang = 'Java' AND s.level = 3) > 0; 
+0

謝謝戈登,你的回答是偉大的,但當我執行請求'SELECT p.name,p.city,s.lang,s .level FROM程序員p INNER JOIN技能s(...)'我得到'name:Joshua,城市:亞特蘭大,lang:Java和級別:3',沒有關於PHP的信息。任何想法? – 2014-12-02 16:13:05

0

這會給你你想要的,但它並不靈活。

select p.name, p.city, php.lang, php.level, j.lang, j.level 
from programmer p 
join skills  php 
    on php.programmer = p.id 
join skills  j 
    on j.programmer = p.id 
where php.lang = 'PHP' and php.level > 1 
    and j.lang = 'Java' and j.level = 3; 

如果你會做了很多這些類型的查詢中,你可能會考慮創建每個技能集的視圖:

create view JavaSkills as 
select programmer, lang, level, exp_from 
from skills 
where lang = 'Java' 

那麼查詢將

select p.name, p.city, php.lang, php.level, j.lang, j.level 
from programmer p 
join PhpSkills php 
    on php.programmer = p.id 
join JavaSkills j 
    on j.programmer = p.id 
where php.level > 1 
    and j.level = 3; 

如果執行計劃不相同,執行計劃應該相似,但查詢有點容易閱讀。這也是尷尬的維護,但一個人做了一件事。 ;)