2016-08-23 20 views
1

我有三個表來管理這些網站中的網站,地理圍欄和密鑰。代碼Ingniter PHP SQL加入

到Geofences的網站是一對多的網站。 Site to Keys是一對多的。

Sites 
     id  int  PK 
     name  varchar 
     deleted bool 

    Geofences 
     id  int  PK 
     site_id int 
     lat  double 
     lon  double 
     rad  double 

    Keys 
     id  int  PK 
     site_id int 
     deleted bool 

SELECT語句:

SELECT *, SUM(IF(kc.deleted = 0, 1, 0)) AS 'KeyCount' 
    FROM Keys kc 
    INNER JOIN Geofences g ON kc.id = g.site_id 
    INNER JOIN Sites s ON s.id = kc.site_id 
    GROUP BY kc.site_id; 

我想算在按鍵與本站不被刪除的每個站點,鍵以及返回每個站點的地理圍欄數據在一個MySQL的聲明。

樣品表中的數據:

Sites ----------------------------------- 

id  name  deleted 
1  site_one 0 
2  site_two 0 
3  site_three 0 

Geofences ----------------------------------- 

id  site_id lat  lon  rad 
1  1   25.5 -123.4 50    
2  1   22.44 -123.3 50 
3  1   20.1 -122.5 50 
4  2   27.22 -120.5 50 
5  2   28.999 -121.11 50 
6  3   29.8 -122 75 

Keys ----------------------------------- 

id  site_id deleted 
1  1   0 
2  1   1 
3  1   0 
4  1   0 
5  2   0 
5  3   0 

任何幫助將是巨大的,我一直在試圖弄明白,現在2小時..

+0

我把它'deleted' = 0意味着它不會被刪除? – Ash

+0

嗨Ashwin,這是正確的:) – Nickmccomb

+1

酷....我要求一個示例輸出,因爲我不明白如何輸出密鑰的計數和geofence信息在一個表中。如果你可以修改你的問題並添加一個示例輸出,它可能會清楚地說明這一點。 – Ash

回答

0

這會給你每個站點密鑰的計數只考慮未刪除的網站和密鑰和地理圍欄信息,但關鍵點數和網站信息(ID和名稱)顯然(並且浪費)爲每個地理圍欄重複。

select X.*, g.* from 
(
    select s.id as Site_Id, s.name as SiteName, count(kc.id) key_count 
    from sites s inner join keys kc on s.Id = kc.site_id 
    where s.deleted = 0 and kc.deleted=0 
    group by s.Id, S.name 
) X inner join GeoFences g on X.Site_Id = g.site_id 

這是我能從你的問題中搜集的。如果您需要別的東西,請提供樣本輸出。

+0

感謝Ashwin,我明天會對它進行測試,並且如果它正常工作,請回答它是正確的:) – Nickmccomb

0

由於Keys.deleted列的值是1或0,你可以使用琛

試試這個:

Select g.*, 
SUM(k.deleted) AS 'KeyCount' 
FROM Sites AS s 
Geofences AS g ON s.id = g.site_id 
JOIN Keys AS k ON s.id = k.site_id 
BY g.id; 
+0

謝謝John,我明天會對它進行測試,並在正確的情況下回答它。歡呼你的幫助 – Nickmccomb