9
votes

Utiliser 'ou' entre avoir et où la clause de MySQL?

J'essaie de chercher des enregistrements dans MySQL en utilisant un champ Soumis simple utilisé. Plus précisément, l'utilisateur saisit un nom (prénom ou nom de nom ou de nom) et le serveur doit renvoyer des lignes correspondantes.

Ce que je fais jusqu'à présent, c'est quelque chose comme: p>

SELECT [some fields], CONCAT(firstname, ' ', 'lastname') as fullname 
FROM people 
WHERE 
   firstname LIKE '%user_submitted_data%' OR 
   lastname LIKE '%user_submitted_data%' OR 
   HAVING fullname LIKE '%user_submitted_data%'


0 commentaires

5 Réponses :


8
votes

faire une sous-requête: xxx


0 commentaires

1
votes

Considérons quelques entrées possibles: xxx pré>

Votre requête d'échantillon initiale est la suivante: p> xxx pré>

maintenant, lorsque l'utilisateur entre dans la première entrée Cette requête choisira toutes les personnes dont le prénom contient 'John'; Il choisira également toutes les personnes dont le nom de famille contient 'John' (par exemple, tous les Johnsons de la base de données). De même, la deuxième entrée choisira toutes les personnes dont le prénom contient 'Smith'; Il choisira également toutes les personnes dont le nom de famille contient 'Smith' (par exemple, les Smithsons et les Smithers). Jusqu'ici tout va bien; Ce n'est pas parfait à cause des problèmes de sensibilisation de cas (je vais ignorer la sensibilité de cas d'ici, mais vous ne devriez probablement pas l'ignorer du tout), mais tout ira bien. P>

La troisième entrée sera choisir uniquement les personnes dont le prénom contient 'John Smith'; Il choisira également ces personnes dont le nom de famille contient 'John Smith'. Cependant, il est plutôt probable qu'il y ait très peu de personnes qui répondent à ces critères - ces personnes appelées John Smith n'auront que John au prénom et juste Smith dans le nom de famille. Ceci est peu susceptible d'être ce que vous aviez à l'esprit. P>

Il n'est pas clair si vous avez une colonne appelée "FULLNAME" dans la table. Si vous le faites, vous pouvez simplement faire correspondre cette colonne au lieu de faire correspondre le prénom et le nom de famille séparément. Si vous ne le faites pas, vous pouvez peut-être fabriquer une telle colonne, puis exécuter la requête contre cela. P>

SELECT *
  FROM (SELECT firstname || ' ' || lastname AS fullname, ... FROM people) AS t 
 WHERE t.fullname LIKE '%user_submitted_data%'


1 commentaires

Merci pour la profondeur Awnser. Pour une raison quelconque, il semble que MySQL soit insensible à la casse de mon système (OSX), de sorte que cela fonctionne jusqu'à présent jusqu'à présent. En ce qui concerne l'ordre des mots, l'opérateur similaire correspond très bien au contexte. Je n'ai pas besoin (ni envie) Johh Smith de sortir lorsqu'un utilisateur cherche John Adam Smith. L'échantillon de recherche est assez limité.



0
votes

Vous pouvez faire référence à une colonne calculée dans la clause où code> si vous définissez cette colonne dans une sous-requête: xxx pré>

mais honnêtement, pour le type de recherche " Re faire, comme code> avec des caractères génériques est une solution terrible. Vous devriez penser à utiliser un Fulltext code> Index: P>

CREATE FULLTEXT INDEX people_names ON people(firstname, lastname);

SELECT *
FROM people
WHERE MATCH(firstname, lastname) AGAINST( ? );


0 commentaires

0
votes

Bien que l'utilisation d'une sous-pérature fonctionne bien, cela aura un impact car vous n'allez pas frapper d'index.

Qu'en est-il de l'ajout d'une colonne calculée ( prénom || '' || lastname ) à la table et un index à cela? Ce serait sûrement beaucoup plus rapide.

Si vous ne pouvez pas faire cela, je pense que cette interrogation comme xxx

devrait toujours fonctionner plus rapidement que deux ou < / code> s et une sous-requête.


3 commentaires

Je ne pense pas qu'il y ait un moyen de faire une colonne de calcul indexée dans MySQL, sinon montrez mes recherches. Si c'est faisable, j'aimerais entendre parler de ça.


Vous pourriez avoir raison, je pense qu'il n'y a aucun moyen d'utiliser des colonnes calculées du tout!?


Pendant ce temps, MySQL prend en charge des colonnes calculées indexées. Mais comme des conditions ne peuvent pas utiliser un index si le modèle commence par un espace réservé (% ).



14
votes

Il suffit de mettre toutes les conditions dans la clause . xxx

le où la clause pourrait supprimer les lignes tôt, mais comme vous ne pouvez pas supprimer Leur jusqu'à ce que après vous avez évalué la condition sur la colonne calculée, et qui doit attendre avoir , il vous achète rien à utiliser .


1 commentaires

Travaillé pour moi, semble être une solution beaucoup plus élégante que d'utiliser des sous-requêtes. Merci!