2015-04-07 26 views
0

連接數據我有3個sqlite的表:SQLite的語法 - 從3個表

inspections,其中insp_idprimary key

id | name   | deleted 
------------------------------ 
I1 | Inspection A | (null) 
I2 | Inspection B | (null) 
I3 | Inspection C | 1 

equip_insp,其中equip_id, insp_idprimary keys

equip_id | insp_id | period | period_type 
-------------------------------------------- 
E1  | I1  | 1  | Y 
E1  | I2  | 6  | M 
E2  | I1  | 1  | M 

equip_certif,其中idprimary key

id | equip_id | insp_id | date  | certif_no | result | info 
------------------------------------------------------------------- 
C4 | E1  | I1  | 2015-02-01 | A-300  | Good | (null) 
C3 | E1  | I1  | 2015-02-01 | A-200  | Good | (null) 
C2 | E1  | I1  | 2015-01-10 | A-100  | Good | (null) 
C1 | E1  | I2  | 2015-01-06 | B-100  | Good | (null) 

所有ID是事實上的數值,我用一些字母只是爲了方便他們在連接之間。

所以,我想用Sqlite語法幫助我,對於項目E1,顯示所有檢查定義(升序),然後如果存在,顯示週期性,然後顯示最新的證書日期(如果有2在同日的證書,獲得最新的ID),數量和結果,是不是信息

結果應該是這樣的:

id | name   | period | period_type | certif_no | date  | result 
-------------------------------------------------------------------------- 
I1 | Inspection A | 1  | Y   | A-300  | 2015-02-01 | Good  
I2 | Inspection B | 6  | M   | B-100  | 2015-01-06 | Good 

我已經嘗試這個,但我不敢肯定那是對的。

SELECT inspections.id, inspections.name, equip_insp.period, equip_insp.period_type, equip_certif.certif_no, equip_certif.date AS certif_date, equip_certif.result 
FROM inspections 
LEFT JOIN equip_insp ON (inspections.id = equip_insp.insp_id AND equip_insp.equip_id = 'E1') 
LEFT JOIN equip_certif ON (inspections.id = equip_certif.insp_id AND equip_certif.info IS NULL) 
WHERE inspections.deleted IS NULL 
GROUP BY equip_insp.insp_id 
ORDER BY inspections.id, date(equip_certif.date) DESC, equip_certif.id DESC 

回答

0

使用SQLite打後,我得到了自己解決。所以答案是:

SELECT inspections.id, inspections.name, equip_insp.period, equip_insp.period_type, equip_certif.certif_no, equip_certif.date AS certif_date, equip_certif.result 
FROM inspections 
LEFT JOIN equip_insp ON (inspections.id = equip_insp.insp_id AND equip_insp.equip_id = 'E1') 
LEFT JOIN equip_certif ON (inspections.id = equip_certif.insp_id AND equip_certif.equip_id = equip_insp.equip_id AND equip_certif.info IS NULL) 
WHERE inspections.deleted IS NULL 
GROUP BY inspections.id 
ORDER BY inspections.id, date(equip_certif.date) DESC, equip_certif.id DESC 
0

要指定返回組中的哪一行,您必須使用MAX();否則,你得到一些randrom行:

SELECT ..., MAX(equip_certif.date) AS certif_date, ... 
FROM ... 
GROUP BY equip_insp.insp_id 
... 

(這僅適用於SQLite的3.7.11或更高版本;在早期版本中,查詢將變得越來越複雜)

+0

你有一個關於如何解決2個證書具有相同日期的情況下的想法,所以我可以得到一個與最新的ID介紹? – REALSOFO