2009-01-19 10 views
2

Je dois utiliser une requête qui va tirer des données d'un champ quand il est inférieur à 4 mots, est-ce possible et si oui pourriez-vous donner quelques pointeurs? Je suppose que si ce n'est pas possible, il pourrait faire défiler les résultats jusqu'à ce qu'il trouve un qui était de 3 mots, puis terminer l'instruction while quand il a trouvé un.PHP MySql Où Field = <4 mots

Répondre

10
SELECT column FROM table where LENGTH(column) - LENGTH(REPLACE(column, ' ', ''))+1 < 4 

Credits and full explanation

Ici Regexp Solution.

select * from TABLE where column not regexp '^.+(.+){4}$' 
+0

Cela devrait fonctionner. Cependant, vous devez écrire que vous vérifiez la longueur d'origine en fonction de la longueur avec tous les espaces remplacés. Ce n'est probablement pas évident pour la personne qui pose la question. – Kris

+0

Je pense que cela échouera si le champ a des espaces de début ou de fin – DanSingerman

+0

Cette solution est également multi-octets, celle avec regex ne l'est pas. – Eineki

1

Appel de fonctions dans une sélection sur un par enregistrement base est presque toujours une mauvaise idée en termes de performance - l'espace disque est généralement beaucoup plus « moins cher » que la capacité du processeur (je joins que dans les citations que je suis ne parle pas des coûts en dollars).

La plupart des bases de données ont tendance à être "plus lues qu'écrire" comme mon mentor de DBA m'a dit une fois; la solution idéale dans cette situation est d'avoir un déclencheur lors de l'insertion ou de la mise à jour de la ligne pour calculer le nombre de mots dans cette colonne et les stocker dans une autre colonne. La raison pour laquelle il est idéal est que le nombre de mots ne change que lorsque vous mettez à jour le champ, il est donc préférable d'effectuer le calcul à ce moment-là plutôt que (inutilement) chaque fois que vous lisez l'enregistrement.

L'espace requis ajouté sera minimal puisque vous ajoutez un entier (court) à un long (chaîne) mais vous trouverez vos requêtes criantes en utilisant simplement le champ entier (assurez-vous d'indexer dessus) .

0

J'allais suggérer un LIKE '% % % %' mais je ne suis pas entièrement sûr si cela fonctionnerait ou non.

+0

cela fonctionne pour> = 4 mots, pas pour <= 4 –

+0

cela ne fonctionne pas si vous avez plus d'un espace entre deux mots – PierrOz

Questions connexes