Exemple en MySQL, en prenant des tags d'id 22 et 33. La requête suivante est simple, mais fausse :
SELECT DISTINCT p.*, GROUP_CONCAT(pt1.tag_id) AS tags_id
FROM Post AS p
JOIN Post_Tag AS pt1 ON (p.id = pt1.post_id)
JOIN Post_Tag AS pt2 ON (p.id = pt2.post_id)
WHERE pt1.tag_id = 22
AND pt2.tag_id != 33 -- cette dernière condition sera toujours remplie si la précédente l'est
On peut s'en sortir avec :
SELECT p.*, GROUP_CONCAT(pt.tag_id) AS tags_id
FROM Post AS p
JOIN Post_Tag AS pt ON (p.id = pt.post_id)
GROUP BY p.id
HAVING MAX(pt.tag_id = 22) = 1 AND MAX(pt.tag_id = 33) = 0
S'il y a plus simple et plus efficace, je suis preneur.
Je n'ai pas testé ces requêtes, je ne garantis pas l'absence de fautes de syntaxe, mais le principe est que les règles "SAUF" sont difficiles sur du many2many.
De mémoire, les tailles de "Post" et "Post_Tag" étaient respectivement de l'ordre de 500k et 800k lignes et le temps de réponse de 4 secondes.
[^] # Re: Séparer stockage (relationnel) et recherche
Posté par rogo . En réponse à la dépêche Petit état des lieux du NoSQL. Évalué à 2.
Exemple en MySQL, en prenant des tags d'id 22 et 33. La requête suivante est simple, mais fausse :
On peut s'en sortir avec :
S'il y a plus simple et plus efficace, je suis preneur.
Je n'ai pas testé ces requêtes, je ne garantis pas l'absence de fautes de syntaxe, mais le principe est que les règles "SAUF" sont difficiles sur du many2many.
De mémoire, les tailles de "Post" et "Post_Tag" étaient respectivement de l'ordre de 500k et 800k lignes et le temps de réponse de 4 secondes.