2017-03-16 70 views
1

我有一個查詢不等於搜尋有LeftJoin

Select 
    m.name 

from machines m 
    innerJoin config c ON m.cod = c.cod 

--> where (c.category = 'BIOS' and c.val = 'System') 
--> and (c.category = 'Users' and c.val = 'Jonas') 

group by c.cod 

* MACHINES ---------------- + 
| key | name | cod | 
* ------ + ------- + ------ + 
| 1  | M1  | 23  | 
| 2  | M2  | 26  | 
| 3  | M3  | 27  | 
+ ------ + ------- + ------ + 

* CONFIG --------------------------- + 
| key | category | cod | val | 
+ ------ + -------- + ----- + ------ + 
| 1  | BIOS  | 23 | System | 
| 2  | Users | 23 | Jonas | 
| 3  | Users | 23 | Maria | 
| 4  | BIOS  | 26 | System | 
| 5  | Users | 26 | Jonas | 
| 6  | BIOS  | 27 | System | 
| 6  | Users | 27 | Ana | 
+ ------ + -------- + ----- + ------ + 

我得到

* RESULT -- + 
| name  | 
+ --------- + 
| M1  | 
| M2  | 
+ --------- + 

其偉大的「平等」的搜索,但我不知道我該怎麼辦「不等於」搜索此查詢。

我想:

Select 
    m.name 

from machines m 
    innerJoin config c ON m.cod = c.cod 

--> where (c.category = 'BIOS' and c.val <> 'System') 
--> or (c.category = 'Users' and c.val <> 'Jonas') 

group by c.cod 

,但仍然得到機「M1」,與價值「瑪麗亞」匹配濾波器

我需要做的與此過濾器的結果領域:

* RESULT -- + 
| name  | 
+ --------- + 
| M3  | 
+ --------- + 

我該怎麼辦呢?

回答

1

您發佈的查詢有重複的錯誤在裏面:來自表c,不mcategoryval

然後,在我看來,你想要的是拋棄那些指對被其他記錄你的條件存在的機器記錄。不幸的是,這不能單靠記錄條件來完成,所以沒有必要否定條件。你必須做這樣的事情:

SELECT DISTINCT name 
    FROM machines 
WHERE name NOT IN (
    SELECT m.name  
     FROM machines m 
     INNER JOIN config c USING (cod) 
     WHERE (c.category = 'BIOS' AND c.val = 'System') 
     AND (c.category = 'Users' AND c.val = 'Jonas') 
) 
+0

工作! ,現在不需要使用GROUP_CONCAT或有,就是我認爲,子查詢是不可避免的 – israel

+0

它可以與具有條件來完成。 (http://sqlfiddle.com/#!9/f2a480/4/1) – xQbert

1
Select 
    m.name 

from machines m 
    innerJoin config c ON m.cod = c.cod 

where NOT (
(m.category = 'BIOS' and m.val = 'System') 
and (m.category = 'Users' and m.val = 'Jonas') 
) 

group by c.cod 
+0

這仍然得到不想要'M1' 2只是改變。 – Dario

0

嘗試下面的腳本:

SELECT M.Name FROM Machines AS M LEFT JOIN CONFIG AS C ON M.Cod=C.Cod 
    WHERE NOT ( 
    (M.Category ='BIOS' AND M.Val='System') AND 
    (M.Category ='Users' AND M.Val='Jonas') 
    ) 

NOT關鍵字是您所查詢的簡單的解決方案。我也做了離開加入,而不是內在,你可以忽略它,如果不需要。

+0

這仍然會得到不需要的'M1'(和LONG的答案相同)。 – Dario

2

試試這個:

SELECT name FROM machines 
WHERE name NOT IN (
SELECT m.name FROM machines m INNER JOIN config c ON m.cod = c.cod WHERE (c.category = 'BIOS' and c.val = 'System') AND (c.category = 'Users' and c.val = 'Jonas') GROUP BY c.cod) 
+0

我upvoted你的答案,因爲它是相同的地雷,並公佈前3分鐘,而我還在打字我的...(當然,相同的......它仍然有'm.'錯誤我在我指出) – Dario

+0

@達里奧感謝您的意見 –

0

Working SQL FIDDLE

由於需要配對值有2個記錄的系統我用這個平等

這並假設category/cod/val在Config中是唯一的。

SELECT m.name 
FROM machines m 
INNER JOIN config c 
    on c.cod = m.cod 
WHERE ((c.category = 'BIOS' and c.val = 'System') 
    OR (c.category = 'Users' and c.val = 'Jonas')) 
GROUP BY m.name 
having count(*) =2 ; 

,這對於不等於......請注意,如果你有更多的「OR」條件而定

SELECT m.name 
FROM machines m 
INNER JOIN config c 
    on c.cod = m.cod 
WHERE ((c.category = 'BIOS' and c.val = 'System') 
    OR (c.category = 'Users' and c.val = 'Jonas')) 
GROUP BY m.name 
having count(*) <>2 ;