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%'
5 Réponses :
faire une sous-requête:
Considérons quelques entrées possibles: Votre requête d'échantillon initiale est la suivante: p> 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%'
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é.
Vous pouvez faire référence à une colonne calculée dans la clause mais honnêtement, pour le type de recherche " Re faire, où code> si vous définissez cette colonne dans une sous-requête: 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( ? );
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 ( Si vous ne pouvez pas faire cela, je pense que cette interrogation comme p> devrait toujours fonctionner plus rapidement que deux prénom || '' || lastname code>) à la table et un index à cela? Ce serait sûrement beaucoup plus rapide. P> ou < / code> s et une sous-requête. p> p>
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é (% code>).
Il suffit de mettre toutes les conditions dans la clause code> code>. le où la clause code> pourrait supprimer les lignes tôt, mais comme vous ne pouvez pas supprimer Leur jusqu'à ce que après em> vous avez évalué la condition sur la colonne calculée, et qui doit attendre avoir code>, il vous achète rien à utiliser où code>. p> p>
Travaillé pour moi, semble être une solution beaucoup plus élégante que d'utiliser des sous-requêtes. Merci!