0
votes

Sélectionnez Du tableau MySQL, commandé par le nombre d'éléments correspondant de catégories

J'ai une table, comme ceci: xxx

exemple de lignes: xxx

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.

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)

Si une personne par exemple vérifie:

  • A et B, ils devraient récupérer les rangées dans cet ordre: Lorem1, Lorem2, Lorem3, Lorem 4

  • A et C, ils devraient récupérer les lignes dans cet ordre: Lorem1, Lorem3, Lorem2

    C'est ce que j'essaie de faire. Je suis assez nouveau pour programmer et ce problème s'est présenté.

    Je sais aussi, peut-être que je devrais créer une nouvelle table pour les connexions entre les catégories et les objets.


1 commentaires

Considérez soit normalisant votre schéma ou ne pas vous déranger avec une base de données relationnelle


3 Réponses :


0
votes

Vous pouvez utiliser Find_in_set () pour rechercher une chaîne dans la liste séparée des virgules. Mais vous devez remplacer () 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 () 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.

Exemple de catégories 'A' et 'c' : < Pré> xxx

Vous pouvez également l'utiliser pour exclure les lignes sans aucune correspondance. La somme sera 0 alors. xxx

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.


1 commentaires

Merci! Cela fonctionne parfaitement! Je n'ai jamais entendu parler de ces fonctions dans MySQL.



0
votes

Au lieu de stocker vos catégories en tant que chaîne, vous devez définir un champ HeuresTomanany 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.


1 commentaires

Oui, c'est une manière plus propre, mais je ne suis pas sûr, comment cela pourrait me rapprocher de la solution.



0
votes

Une version normalisée de vos données pourrait être la suivante: xxx pré>

maintenant - lorsque vous recherchez des éléments dans les catégories 'A' et 'B', la requête SELECT serait: p> xxx pré>

résultat: p> xxx pré>

si vous souhaitez rechercher dans des catégories 'A' et 'c', changez la clause WHERE vers p> xxx pré>

Le résultat serait: p> xxx pré>

Vue sur DB Fiddle 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          |


1 commentaires

Vous êtes un sorcier. Merci beaucoup!