2015-04-07 1 views
0

J'ai 3 tables SQLite:syntaxe SQLite - joindre les données à partir de 3 tables

Table inspections, où insp_id est-primary key

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

tableau equip_insp, où equip_id, insp_id sont primary keys

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

Table equip_certif, où id est primary 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) 

Tous les ID sont en fait des valeurs numériques, j'utilise quelques lettres juste pour être facile de les relier entre eux. Donc, je voudrais m'aider avec la syntaxe Sqlite que pour l'article E1, afficher toutes les inspections définies (ascendantes), puis si elles existent, afficher la périodicité puis afficher la dernière date du certificat (s'il y en a 2) certificats à la même date, obtenir les dernières id), le nombre et le résultat qui n'est pas d'info

résultat devrait être quelque chose comme ceci:

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 

J'ai essayer, mais je ne suis pas si sûr c'est correct.

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 

Répondre

0

Après avoir joué avec SQLite je reçois la solution par moi-même. Donc la réponse est:

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

Pour spécifier quelle ligne d'un groupe est renvoyée, vous devez utiliser MAX(); sinon, vous obtenez une ligne de randrom:

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

(. Cela ne fonctionne que dans SQLite 3.7.11 ou plus tard, en version antérieure, la requête obtiendrait plus complexe)

+0

avez-vous une idée sur la façon de résoudre le cas lorsque 2 certificats ont la même date, donc je peux obtenir celui avec le dernier id introduit? – REALSOFO