Bonjour à tous.
Après une conception plus que douteuse de ma BDD, je me suis aperçu que la structure retenue pour mes tables ne permettait peut-être pas de faire une sélection bien particulière dont il sera question dans ce topic.
Partons du principe que je dispose de deux tables : une décrivant des objets quelconques nommée "système" et une autre contenant des étiquettes, sortes de tags comme certains les appellent, qualifiant les objets décris dans la 1ière table.
La structure retenue est la suivante (je donne un exemple avec des voitures):
SYSTEME :
| id | car |
-------------------------------
| 1 | peugeot_807 |
| 2 | renault_clio |
| 3 | volkswagen_polo |
TAGS :
| car_id | tag_name | tag_value |
---------------------------------------------
| 1 | COLOR | FF0000 |
| 1 | CAPACITY | 7 |
| 2 | COLOR | 00FF00 |
| 2 | CAPACITY | 5 |
| 3 | COLOR | 0000FF |
Jusqu'à hier soir tout fonctionnait bien au pays des bisounours mais j'ai voulu sélectionner les voitures qui étaient à la fois rouges et qui avaient un nombre de places (CAPACITY) supérieur ou égal à 4 en une seule requête.
Une difficulté supplémentaire : j'aimerai que tout se passe dans le WHERE vu que je génère mes requêtes à la volée et que j'aimerai garder une structure similaire dans les reste de ces dernières. Mais cela reste optionnel bien que souhaitable.
J'ai réfléchi à une première solution : utiliser un count pour compter le nombre de tags effectivement présents après un OR :
Le OR étant un OU Inclusif, seulement certains des tags retenus peuvent être présent pour que ça passe : on teste donc le nombre de lignes pour vérifier que le nombre de tags maximal est atteint (que les voitures sont bien rouges ET ont un nombre de place >= 4).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT car, COUNT(*) AS carTags_num FROM SYSTEME S LEFT JOIN TAGS T ON S.id=T.car_id WHERE ((T.tag_name='COLOR' AND T.tag_value='FF0000') OR (T.tag_name='CAPACITY' AND T.tag_value>=4)) AND count=2
Comment feriez-vous donc pour effectuer cette sélection (de manière optimisée si possible) autrement que par ce count affreux?
Pour info je travaille sous MySQL 5.x.
Merci par avance pour votre aide.
Partager