J'ai une table, comme ceci: exemple de lignes: p> J'ai aussi un formulaire, où vous pouvez vérifier Les catégories que vous êtes intéressés. Cela devrait être le guide de l'ordre du SELECT. P> Tout d'abord, vous récupérez les lignes, qui contient toutes les catégories sélectionnées, vous obtenez lesquelles vous obtenez, moins de match. (Si la ligne n'a aucune des catégories, elle ne s'affichera pas) p> Si une personne par exemple vérifie: p> A et B, ils devraient récupérer les rangées dans cet ordre: Lorem1, Lorem2, Lorem3, Lorem 4 P> Li>
A et C, ils devraient récupérer les lignes dans cet ordre: Lorem1, Lorem3, Lorem2 P> Li>
ul> C'est ce que j'essaie de faire. Je suis assez nouveau pour programmer et ce problème s'est présenté. P> Je sais aussi, peut-être que je devrais créer une nouvelle table pour les connexions entre les catégories et les objets. P> P>
3 Réponses :
Vous pouvez utiliser Exemple de catégories Vous pouvez également l'utiliser pour exclure les lignes sans aucune correspondance. La somme sera 0 alors. P> mais les listes séparées par virgule sont une douleur. Vous devriez envisager de réviser le schéma et avoir une autre table, qui relie les éléments aux catégories. P> P> Find_in_set () code> pour rechercher une chaîne dans la liste séparée des virgules. Mais vous devez remplacer () code> les espaces d'abord. Faites-le pour chaque catégorie sélectionnée par l'utilisateur. Ensuite, vérifiez si le résultat de Find_in_set () code> est supérieur à 0, car 0 signifie que cela n'a rien trouvé, sinon il renvoie la position dans la liste, qui est supérieure à 0. Ajouter les résultats de ces comparaisons. Étant donné que les opérations booléennes qui sont vraies sont 1 dans le contexte numérique et sinon 0, vous pouvez ensuite commander par cette somme décroissante. C'est à dire. Plus il est possible d'assortir une ligne, plus tôt est déposé dans le résultat. 'A' code> et 'c' code>: p> < Pré> xxx pré>
Merci! Cela fonctionne parfaitement! Je n'ai jamais entendu parler de ces fonctions dans MySQL.
Au lieu de stocker vos catégories en tant que chaîne, vous devez définir un champ HeuresTomanany code> dans votre table utilisateur. Ainsi, un utilisateur peut faire partie d'une ou de plusieurs catégories et inversement. La table Catégories peut stocker les différentes catégories avec leurs identifiants respectifs. p>
Oui, c'est une manière plus propre, mais je ne suis pas sûr, comment cela pourrait me rapprocher de la solution.
Une version normalisée de vos données pourrait être la suivante: maintenant - lorsque vous recherchez des éléments dans les catégories 'A' et 'B', la requête SELECT serait: p> résultat: p> si vous souhaitez rechercher dans des catégories 'A' et 'c', changez la clause WHERE vers p> Le résultat serait: p> Vous pouvez même "émuler" votre schéma d'origine avec P> | id | name | categories |
| --- | ------ | ---------- |
| 1 | Lorem1 | A, B, C |
| 2 | Lorem2 | A, B |
| 3 | Lorem3 | A, C |
| 4 | Lorem4 | B |
Vous êtes un sorcier. Merci beaucoup!
Considérez soit normalisant votre schéma ou ne pas vous déranger avec une base de données relationnelle