7
votes

PHP MySQL pour permutations sur la table MySQL

J'ai une table MySQL avec 7 colonnes, sur laquelle chaque ligne contient des valeurs entières.

J'ai un site simple qui reçoit des valeurs de l'utilisateur et je dois essayer de voir si les valeurs envoyées par l'utilisateur correspondent ou sont similiaires à l'une des lignes de la table.

Donc, l'utilisateur écrit E.G. 1 2 3 4 5 6 7 en entrée.

Je dois savoir si l'une des lignes de ma table est similaire à celle-ci sans ordre. Donc 1 2 3 4 5 6 7 = 7 6 5 4 3 2 1 et ainsi de suite. Le tableau mon contient plus de 40 000 rangées de données.

Je dois aussi voir s'ils partagent au moins 5 , 6 ou 7 chiffres en commun.

Cela signifie utiliser des permutations pour trouver toutes les combinaisons possibles. Cependant, quelle est la meilleure approche pour un tel problème?

  1. Prenez l'entrée de l'utilisateur et obtenez toutes les permutations et faites correspondre contre la première rangée, la deuxième ligne, etc. et signaler si elle est trouvée? Alternativement, effectuez l'inverse, obtenez une ligne de la table et obtenez toutes les permutations et faites la correspondance contre l'entrée de l'utilisateur?

  2. Qu'en est-il de la mémoire et de la cposition lorsque vous passez une telle table avec tant de permutations?


1 commentaires

La meilleure approche serait d'organiser la saisie de l'utilisateur et les données de la même commande ascendante, puis de comparer.


3 Réponses :


1
votes

Une méthode de lumière peut être d'ajouter un champ supplémentaire dans votre base de données, une version commandée numériquement des 7 champs combinés.

par exemple. Si les données de la base de données étaient 2 4 7 6 5 1 3, le champ de combinaison serait 1234567

puis lors de la comparaison, trier la réponse des utilisateurs numériquement et comparer contre le champ de combinaison de la base de données.

Selon ce que vous faites, vous pouvez écrire votre requête comme celle-ci xxx

Si vous savez ce que le nombre minimum de numéros correspondants doit être, cela éclaircirait La requête

Pour savoir à quel point ce qu'ils ont écrit vs ce qui est dans la base de données. Vous pouvez utiliser la fonction LEVENSHTEININ PHP: http://php.net/manual/fr/function .levenshtein.php xxx


0 commentaires

0
votes

J'ai bien peur que vous ne puissiez pas construire une requête sur un problème comme celui-ci de manière très efficace.

Vous pouvez construire où code> clause comme: p> xxx pré>

Mais ce serait un enfer d'une condition. D'autre part, vous pouvez essayer d'utiliser la combinaison de: p>

  • in () code> li>
  • si () Code> li>
  • avoir code> li> ul>

    d'abord de chèque si la colonne 1 code> contient des informations: p> xxx pré>

    Somme toutes ces données: p>

    SELECT (
        $MAX_NUMBER$ - BIT_COUNT( XOR( `binary_representation`, $DATA_FROM_USER$))
    ) AS `matches_cnt`
    


0 commentaires

3
votes

dans un schéma normalisé complet, il s'agit d'une seule requête forte>

Supposons votre table avec PK comme: p> xxx pré>

à l'heure actuelle , nous pouvons normaliser les données telles que: p> xxx pré>

dans la requête précédente, il est facile de correspondre à vos exigences avec un seul ayant: p> xxx pré >

Résultats : P>

| PK |
------
|  b |


1 commentaires

Hmmm..did ne voyait pas l'approche d'avoir une approche, merci pour la solution, va certainement lui donner une allée!