SQLite语法 - 从3个表中连接数据

时间:2015-04-07 21:26:00

标签: sqlite

我有3个sqlite表:

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

2 个答案:

答案 0 :(得分:0)

要指定返回组中的哪一行,必须使用MAX();否则,你得到一些randrom行:

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

(这仅适用于SQLite 3.7.11或更高版本;在早期版本中,查询会变得更复杂。)

答案 1 :(得分: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