6
votes

% Comme% récupère, par exemple. Données des femmes lors de l'appel des hommes

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REGEXP '[[:<:]]Men[[:>:]]')' at line 1 (SQL: select count(*) as aggregate from items where item_status = ? and (tags LIKE REGEXP '[[:<:]]Men[[:>:]]')) (Bindings: array ( 0 => 2, ))

10 commentaires

Pouvez-vous nous montrer un exemple de la valeur des balises ?


Parce que lorsque vous utilisez% des hommes%, des femmes reviendront. Aussi nomen retournera vrai. Tout se termine avec les hommes reviendra vrai ..


Avez-vous une liste séparée de l'espace des balises dans le champ Tags ?


@Alexeymatskoff Commas, juste mis à jour.


@LukasgeiterIriter juste mis à jour.


@geekido ouais c'est la question que j'essaie de faire face


Utilisez ensuite où Tags = '. $ UID.' pour certaines choses.


@Geekido mais tout droit après la Parole, j'ai une virgule, ça marche toujours de cette façon?


Une des raisons pour lesquelles vous ne devriez pas utiliser la liste séparée des virgules. C'est désordonné.


Cela vous permettrait de penser à recréer vos tables et d'utiliser clé étrangère (si votre dB est comme " innodb ") - est mon avis.


3 Réponses :


-1
votes

Dans votre requête, vous avez dit: Trouvez tout ce qui contient la balise 'Hommes' => '% Men%' Code>, c'est pourquoi il montre: femmes et hommes, afin de répondre à votre question que vous devriez Utilisation commence avec au lieu de contient, comme ceci:

$query->where('tags', 'LIKE', $uID.'%');


4 commentaires

Toutes mes excuses de ne pas donner un exemple de tags femmes, chaussures, hommes, coin (n'a pas de sens) mais oui


Voir ce n'est-il pas saisir parce que avant le mot les hommes, il n'a pas de carte sauvage. Mais avant cela, c'est une virgule


-> Où (fonction ($ (Query) utilise ($ QueryRarR) {Foreach ($ QueryRarR as $ UID) {$ Query-> ou où ('Tags', "comme", $ uid. "% ');}


Lol tu ne comprends pas du tout, pourquoi répondre quand tu ne comprends pas? Vous dites% faux% que diable, s'il s'agit de% des hommes%, il appellerait les données des femmes qui sont ce qu'il essaie de résoudre. Lol tu donnes son problème comme solution? Quoi?



2
votes

Si des valeurs sont séparées par des virgules, essayez d'utiliser la suite

WHERE `tags` REGEXP "(^|,)men(,|$)"


10 commentaires

Pour la première et dernière balise, il placerait l'espace à l'avant et la dernière étiquette, espace à la fin. Cela fonctionnerait toujours?


J'avais des valeurs suivantes: "hommes", "femmes", "femmes, hommes", hommes ", femmes", "chiens, hommes, oiseaux". J'ai rencontré la requête suivante: Select * à partir de test tags regexp "(^ |,) hommes (, | $)" Et cela m'a renvoyé tous les enregistrements sauf "Femmes". Comme cela devrait être. Vérifié sur mysql. Vous pouvez donner plus d'exemples et je peux vérifier la requête sur eux.


Qu'en est-il des hommes, des chaussures, sac


@Flyingatom, il est sélectionné


@AlexeMatskoff Mais vous avez dit "Cela nécessitera une virgule ou une fin de ficelle autour du mot hommes."


J'ai également testé ma requête sur tous les exemples ci-dessus + copie d'eux avec "Hommes" remplacés par "Femmes". Cela a fonctionné bien.


@Flyingatom Peut-être que mes mots ne sont pas assez clairs =) désolé si oui.


@Flyingatom, il voulait dire que avec cette regex, il ne correspondra que hommes s'il y a une virgule ou rien au début / fin du mot. Qui est exactement ce que l'OP a besoin.


@AlexeMatskoff, donc si mes tags sont comme des hommes, des chaussures, la chemise, votre regex peut aussi l'attraper? Parce que avant que les hommes ne reçoivent pas de virgule mais que vous semble le faire nécessiter. J'ai essayé la maison, la décoration, les hommes, il ne détecte pas les hommes


@CODEGURU, oui, il devrait également saisir de telles valeurs. Voici mon Exemples et voici le Résultats de la requête



2
votes

Votre solution REGEXP lance l'erreur de syntaxe en raison du mot clé supplémentaire comme. La syntaxe correcte est simplement où la colonne REGEXP 'motif' .

Si vous trouvez que cela est difficile à retenir, essayez d'utiliser Rignement à la place, ce qui est synonyme de REGEXP de MySQL. Il y a moins de chances que vous écris accidentellement où colonne comme ripe ... dans votre requête parce qu'il est évidemment redondant.

Le motif lui-même devrait fonctionner bien. Personnellement, je n'aime pas utiliser ces classes de limites de mots dans MySQL; Depuis que vous savez que vos tags sont délimités et spacieux, [] man [] fonctionnerait aussi bien. Le mot de la classe limite se casse à la ponctuation autre que les traits de soulignement, vous pouvez donc avoir des problèmes si vous avez des étiquettes hyphogènes, par exemple.

Si vous souhaitez utiliser plusieurs balises de mots avec des espaces, l'un des schémas précédents est la buggy. Dans ce cas, j'essaierais de rester avec des virgules comme votre délimiteur, débarrassez-vous du rembourrage des espaces et utilisez plutôt des ancrages, comme suggéré dans l'une des autres réponses: (^ |,) Man ($ |,)


0 commentaires