J'ai un champ MySQL qui peut contenir des valeurs simples et dans la requête SQL I DO: p> S'il y a des valeurs CSV , ça marche correctement. Comment puis-je écrire la requête pour vérifier les deux demandant l'aide. P> p>
3 Réponses :
Compte tenu de votre schéma la seule solution que je peux penser à utiliser Mais cela sélectionnera également des lignes avec Aussi votre solution est une sorte d'antidiote. Normalement, vous utiliseriez une relation unique pour cela. P> comme code>. p>
Sélectionnez ID, nœud du suivi où center_id comme "% ad%" code>; p>
CAD code>, ada code> etc. et ne peut être utilisé que pour vérifier une seule option par état (afin que vous puissiez utiliser Et code> / ou code> avec plusieurs comme code> déclarations.) P>
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," code> dans les données), alors le comme code> pourrait faire la même chose: ... comme '%, aj,%' code> 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 () code> cette colonne par la virgule pour que mon la valeur est en fait là.
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 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> Si c'est l'inverse, et que vous cherchez à utiliser toutes ces valeurs dans un mysqli: p> PDO: P> Find_in_set () code>. Cela peut rechercher une seule valeur dans une liste séparée par une virgule.
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> // 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
}
Désolé, ce n'est pas ma condition.
Où centre_id dans
@Pamela est la réponse mise à jour plus ce que vous cherchez?
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)."')
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 code> table. Chaque enregistrement dans cette nouvelle table contiendrait une clé étrangère sursuivi code> et une valeur d'identification centrale. Donc, il pourrait contenir des valeurs zéro à plusieurs pour chaque enregistrement code> suivi code>. Ensuite, dans votreSELECT CODE> 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?