0
votes

Requête MySQL Pour sélectionner des données où, où la clause contient des valeurs séparées par des virgules et des valeurs individuelles

J'ai un champ MySQL qui peut contenir des valeurs simples Center_id telles que AB ou des valeurs CSV, telles que AB, AJ etc. Actuellement, je fais ce qui suit dans PHP: xxx

et dans la requête SQL I DO: xxx

S'il y a des valeurs CSV , ça marche correctement. Comment puis-je écrire la requête pour vérifier les deux valeurs CSV et une valeur unique

demandant l'aide.


5 commentaires

Le réel correction ici est probablement de normaliser les données afin que une colonne ne contienne pas plusieurs valeurs. Vous n'avez donc pas à faire des tours avec interroger les données. Est-ce une option dans votre cas?


Il est passé d'un champ multisélection. Par conséquent, stockés sous forme de valeurs CSV sur le terrain.


Le multiiselect pourrait être une valeur ou plus de valeurs.


Ensuite, il semble que la réponse est oui, c'est une option ici. Vous devez créer une deuxième table pour stocker les valeurs associées. Quelque chose comme un suivi_center table. Chaque enregistrement dans cette nouvelle table contiendrait une clé étrangère sur suivi et une valeur d'identification centrale. Donc, il pourrait contenir des valeurs zéro à plusieurs pour chaque enregistrement suivi . Ensuite, dans votre SELECT Vous rejoindrez les deux tables et la requête sur les valeurs exactes, plutôt que de faire une manipulation de chaîne comme celle-ci.


Comment pouvez-vous indiquer la différence entre une seule valeur par rapport à une liste séparée par une virgule avec un élément?


3 Réponses :


1
votes

Compte tenu de votre schéma la seule solution que je peux penser à utiliser comme .

Sélectionnez ID, nœud du suivi où center_id comme "% ad%" ;

Mais cela sélectionnera également des lignes avec CAD , ada etc. et ne peut être utilisé que pour vérifier une seule option par état (afin que vous puissiez utiliser Et / ou avec plusieurs comme déclarations.)

Aussi votre solution est une sorte d'antidiote. Normalement, vous utiliseriez une relation unique pour cela.


3 commentaires

Je viens de fournir un exemple, comme AB, AJ etc..it pourrait être n'importe quoi et des valeurs simples ou simples


C'est une sorte de hack, mais si l'on ajoute toujours les virgules avant et après la valeur stockée (par exemple, par exemple ", AB, AJ," dans les données), alors le comme pourrait faire la même chose: ... comme '%, aj,%' Cela devrait empêcher les faux positifs. Mais vous avez raison, la normalisation des données est la solution réelle ici. Je ne pense tout simplement pas que nous en savons suffisamment sur le système de fournir une solution complète à cet égard, autant que la logique de l'application devrait également changer.


À tout moment, j'ai dû utiliser une solution comme celle-ci pour une liste séparée par des virgules dans une base de données, je bouconne toujours les données avant de l'utiliser et exploser () cette colonne par la virgule pour que mon la valeur est en fait là.



1
votes

S'il n'utilise pas de valeurs indexées (afin que d'énormes jeux de données, cela peut être assez lent), vous pouvez utiliser la fonction MySQL Find_in_set () code>. Cela peut rechercher une seule valeur dans une liste séparée par une virgule.

Bien que cela ne puisse rechercher plusieurs valeurs à la fois, à partir de ce que je comprends dans la question, vous recherchez simplement une valeur unique à la fois. P>

La fonction prend la valeur pour rechercher (sensible à la casse!), puis la colonne à rechercher dans. p> xxx pré>

  • DB Fiddle LI> ul>

    Si c'est l'inverse, et que vous cherchez à utiliser toutes ces valeurs dans un où dans (..) code>, vous pouvez simplement exploser () CODE> Il est indépendamment si c'est un ou non - le retourvalue sera un tableau que vous pouvez utiliser, peu importe la longueur de 1 ou plus. Vous devriez cependant utiliser une déclaration préparée dans ce faisant. Vous pouvez y parvenir en générant une requête dynamique basée sur la longueur de la matrice. P>

    mysqli: p> xxx pré>

    PDO: P>

    // Create connection, $pdo = new PDO(...);
    // You should set PDO to throw exceptions on errors
    
    $parts = explode(',', $usercenter); // Split the comma-separated values 
    if (empty($parts)) {
        // Handle it
    }
    
    $stmt = $pdo->prepare("SELECT id, node
                              FROM followup 
                              WHERE center_id IN (".implode(',', array_fill(0, count($parts ), '?')).")");
    $stmt->execute([...$parts]);
    while ($row = $stmt->fetch()) {
        // Use $row['id'] and $row['node'] for each row
    }
    


3 commentaires

Désolé, ce n'est pas ma condition.


Où centre_id dans


@Pamela est la réponse mise à jour plus ce que vous cherchez?



1
votes

Vous devez utiliser la fonction Find_in_set () renvoie la position d'une chaîne dans une liste des chaînes. Il travaille à la fois des valeurs séparées et individuelles des virgules. Essayez la requête suivante

SELECT id,node
FROM followup
WHERE FIND_IN_SET('center_id','".implode("','",$centerid)."')


0 commentaires