Bonjour à tous,
j'ai actuellement une base sqlite avec 2 tables :
Les tables
detection :
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 :
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" :
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) :
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
Partager