307 votes

MySQL comme IN() ?

Ma requête actuelle ressemble à ceci :

J’ai fait quelques regardant autour et ne trouve rien de semblable à un IN() comme - j’envisage qu’il fonctionne comme ceci :

Toutes les idées ? Je suis juste à penser le problème de la mauvaise manière - quelques obscure commande je n’ai jamais vu.

MySQL 5.0.77-community-log

506voto

Paul Dixon Points 122033

Une REGEXP pourrait être plus efficace, mais vous devriez comparer pour être sûr, par exemple

196voto

David Carroll Points 831

Paul Dixon réponse a fonctionné à merveille pour moi. Pour ajouter à cela, voici quelques choses que j'ai observées pour les personnes souhaitant utiliser les REGEXP:

Pour Accomplir de multiples tels que les filtres avec des caractères génériques:

 SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
                           OR field LIKE '%1938 %'
                           OR field LIKE '%1940 %';  

Utiliser REGEXP Alternative:

 SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';

Les valeurs au sein de REGEXP guillemets et entre la | du (OU des) opérateur sont traités comme des caractères génériques. Généralement, les REGEXP exigera des expressions génériques tels que (.*)1740 (.*) pour travailler en tant que %de 1740 %.

Si vous avez besoin de plus de contrôle sur le placement du générique, l'utilisation de certains de ces variantes:

Pour Accomplir COMME avec contrôle de Générique de Placement:

SELECT * FROM fiberbox WHERE field LIKE '1740 %'
                          OR field LIKE '%1938 '
                          OR field LIKE '%1940 % test';  

Utilisation:

SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
  • Placer ^ en face de la valeur indique le début de la ligne.

  • Plaçant $ après la valeur indique la fin de la ligne.

  • Placé (.*) se comporte un peu comme le générique%.

  • L' . indique n'importe quel caractère, à l'exception des sauts de ligne. La mise en place . à l'intérieur de () * (.*) ajoute un motif de répétition indiquant le nombre de caractères jusqu'à la fin de la ligne.

Il y a des moyens plus efficaces pour affiner des rencontres spécifiques, mais qui nécessite le plus d'examen des Expressions Régulières. REMARQUE: tous les modèles regex semblent fonctionner à MySQL consolidés. Vous aurez besoin de tester vos habitudes et de voir ce qui fonctionne.

Enfin, Pour Accomplir de Multiples AIME et AIME PAS les filtres:

SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
                          OR field LIKE '%1938 %'
                          OR field NOT LIKE '%1940 %'
                          OR field NOT LIKE 'test %'
                          OR field = '9999';

Utiliser REGEXP Alternative:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
                          OR field NOT REGEXP '1940 |^test ';

OU Mixte Alternative:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
                          OR field NOT REGEXP '1940 |^test '
                          OR field NOT LIKE 'test %'
                          OR field = '9999';

Avis je me suis séparé de la PAS mis dans un autre OÙ le filtre. J'ai expérimenté avec l'aide de la négation des modèles, des schémas, et ainsi de suite. Toutefois, ces expressions ne semblent pas produire les résultats escomptés. Dans le premier exemple ci-dessus, j'utilise ^9999$ pour indiquer la correspondance exacte. Cela vous permet d'ajouter des rencontres spécifiques avec des caractères génériques matchs dans la même expression. Cependant, vous pouvez également mélanger ces types de déclarations comme vous pouvez le voir dans le deuxième exemple ci.

Concernant les performances, j'ai couru quelques petits tests à l'encontre d'une table existante et n'a trouvé aucune différence entre mon variations. Cependant, j'imagine que la performance pourrait être un problème avec les plus grandes bases de données, des champs plus vastes, plus le nombre d'enregistrements et de plus de filtres complexes.

Comme toujours, l'utilisation de la logique ci-dessus que c'est logique.

Si vous voulez en savoir plus sur les expressions régulières, je recommande www.regular-expressions.info un bon site de référence.

15voto

Quassnoi Points 191041

Vous pouvez créer une vue d’inline ou une table temporaire, remplissez-le avec vous des valeurs et publier ceci :

Cela, toutefois, vous pouvez rapporter vous plusieurs lignes pour une c’est quelque chose comme , de sorte que cette requête, vous pouvez adapter mieux :

7voto

gahooa Points 38006

Désolé, aucune opération n’est semblable à `` dans mysql.

Si vous souhaitez utiliser l’opérateur LIKE sans une jointure, vous aurez à faire de cette façon :

Vous le savez, MySQL n’optimise pas cette requête, FYI.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X