Bonjour à tous,

j'ai actuellement une base sqlite avec 2 tables :
Les tables
detection :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CREATE TABLE `detection` (
	`created_at`	TEXT NOT NULL,
	`count_value`	INTEGER NOT NULL,
	`type_obj`	INTEGER NOT NULL DEFAULT 0
);
et caracteristique :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CREATE TABLE `caracteristique ` (
	`key`	TEXT NOT NULL,
	`value`	TEXT NOT NULL,
	`id_datas`INTEGER NOT NULL
);
Il n'ya pas de clé étrangère entre ces deux tables car la table caracteristique peux contenir des données pour d'autres tables (j'ai volontairement exclu les champs non utile à ma question).

Donc une ligne de la table "detection" peux avoir n lignes dans la table "caracteristique". L'idée derrière les champs key et value c'est que les caracterisitques et valeurs sont des champs "libre" et donc les utilisateur peuvent créer des caracteristique sans avoir à intervenir sur la structure de la bdd.

Les données

Exemples de données pour bien comprendre :
detection :
"2019-06-26 09:40:00" "1" "1"

caracteristique :
"age" "35" "4"
"gender" "M" "4"

Avec cette architecture je peux donc facilement trouver toutes les détections qui ont par exemple un genre égal à "M" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT * FROM detection d LEFT JOIN caracteristique ca ON d.rowid = ca.id_datas AND ca.type_table = 1 WHERE ca.key = 'gender' AND ca.value = 'M';
Le select * est juste là pour la démo , pas tapé

Mon problème arrive quand je veux combiner plusieurs "caracteristiques" , par exemple faire la somme de toutes les détections ayant un genre à 'M' et un age égale à "35".
J'ai réussi en faisant une jointure supplémentaire mais je trouve ça fastidieux (surtout si j'ai bcp de caracteristiques à combiner) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT * FROM detection d LEFT JOIN caracteristique ca ON d.rowid = ca.id_datas AND ca.type_table = 1 LEFT JOIN carac ca2 ON d.rowid = ca2.id_datas AND ca2.type_table = 1 WHERE ca.key = 'gender' AND ca.value = 'M' AND ca2.key = 'age' AND ca2.value='35';
Y'a t'il moyen de faire mieux ?

Merci