2015-06-03 73 views
1

我有兩個表:從JOIN MySQL的排除結果

locations 
--------------------- 
| id INT, PK, AI | 
| x  INT   | 
| y  INT   | 
--------------------- 

signals 
--------------------- 
| id INT, PK, AI | 
| location_id INT | 
| mac   INT | 
| strength INT | 
--------------------- 

一個位置可以(將)具有多達最大4個信號。如果位置是X,則Y指向圖像,信號是X,Y範圍內的接入點以及它的信號強度。

無論如何,我有一個方法,我提供List最多4個MAC地址,我需要找到包含這4個地址的所有locations

現在我編程這樣做的:
1.取頂部信號強度X,Y和它的MAC地址
2. SELECT * FROM signals WHERE mac = ScanResult.BSSID
3.創建ID的數組返回signals.location_id
4.散裝如果他們的ID在陣列中,則選擇所有位置以及與這些位置相關的所有信號
5.循環中的複雜循環創建一個陣列,其中包含所有位於其關係中的位置,我在List中提供的所有4個mac地址以及刪除其他。

這是令人難以置信的混亂,並有冗餘的查詢,但由於我不是很好的SQL它是一種工作的補丁。

現在我想知道是否可以單獨使用SQL並返回locations包含這4個mac地址。

我:

SELECT locations.*, signals.* FROM locations INNER JOIN signals ON locations.id = signals.location_id; 

我會少些困惑,如果我只需要排除的位置,其中的關係是1:1,但這裏的每個位置有多達4個信號。有沒有一種方法可以爲查詢提供一個「數組」,並從該JOIN中刪除所有locations不包含此數目的MAC地址和這些MAC地址。

回答

1

Andomar的解決方案基於示例查詢是正確的。但是,數據結構與查詢不同,查詢並不合理。我認爲這是所有必要的:

SELECT s.location_id 
FROM signals s 
WHERE s.MAC in (1, 2, 3, 4) 
GROUP BY s.location_id 
HAVING COUNT(DISTINCT s.MAC) = 4; 
2

有沒有一種方法,我可以提供一個「陣列」的查詢

是的,有這個一個operator。你甚至可以提供另一種查詢作爲參數

SELECT * FROM locations WHERE id IN (SELECT location_id FROM signals WHERE mac = ScanResult.level); 
  • 你也可以使用NOT IN排除其中包含在列表中的元素
+0

這將返回任何具有任何MAC地址的位置。 OP希望具有所有提供的MAC地址的位置。 – Andomar

3

您可以使用having條款,以確保一個位置有四個MAC地址:

SELECT l.id 
,  l.x 
,  l.y 
FROM locations l 
JOIN signals s 
ON  s.location_id = l.location_id 
WHERE s.MAC in (1, 2, 3, 4) 
GROUP BY 
     l.id 
,  l.x 
,  l.y 
HAVING COUNT(DISTINCT s.MAC) = 4