que je cherchais sur le net et demander aux gens à titre indicatif, mais personne ne semble connaître la bonne solution (relativement rapide) au problème:MySQL many-to-many complément mis
J'ai trois tables, classique many-to-many solution:
entries
: id (int), titre (varchar [255]), le contenu (texte)tags
: id (int), nom (varchar [255]) , slug (varchar [255])entries_tags
: id (int), entry_id (int), tag_id (int)
Rien d'extraordinaire à ce jour. Maintenant, nous allons dire que j'ai des données de test dans les balises (je garde des limaces car ils ne sont pas importants):
ID | name
1. | one
2. | two
3. | three
4. | four
5. | five
J'ai aussi trois entrées:
ID | title
1. | Something
2. | Blah blah blah
3. | Yay!
et relations:
ID | entry_id | tag_id
1. | 1 | 1
2. | 1 | 2
3. | 2 | 1
4. | 2 | 3
5. | 3 | 1
6. | 3 | 2
7. | 3 | 3
8. | 4 | 1
9. | 4 | 4
OK, nous avons nos données de test. Je veux savoir comment obtenir toutes les entrées qui ont le tag One, mais n'a pas tag Three (ce serait les entrées 1 et 4).
Je sais comment faire avec sous-requête, le problème est, il faut beaucoup de temps (avec 100k entrées, il a fallu environ 10-15 secondes). Y a-t-il un moyen de le faire avec JOINs? Ou est-ce que je manque quelque chose? Je suppose que j'aurais dû mentionner que j'ai besoin d'une solution qui fonctionne avec des ensembles de données plutôt que des étiquettes simples, donc remplacez 'Un' dans ma question par 'Un', 'Deux' et 'Deux' avec 'Trois', 'Quatre'
edit2 La réponse fournie est correcte, mais elle est trop lente pour être utilisée pratiquement. Je suppose que la seule façon de le faire fonctionner est d'utiliser un moteur de recherche tiers comme Lucene ou ElasticSearch.
Cela l'a fait dans 1/3rd de la fois précédente (~ 5 secondes) et je suppose que c'est le plus que vous pouvez obtenir sans mettre en cache le résultat et faire une sorte de tours de magie vaudou. Merci beaucoup! – d4rky
Toujours le bienvenu! En fait, il y a une autre idée, et j'ai déjà mis à jour ma réponse avec sa mise en œuvre. Pourriez-vous essayer? –