2008-12-03 10 views
4

J'ai une table MySQL contenant des noms de domaine:inverse de SQL LIKE '% de la valeur%'

+----+---------------+ 
| id | domain  | 
+----+---------------+ 
| 1 | amazon.com | 
| 2 | google.com | 
| 3 | microsoft.com | 
| |  ...  | 
+----+---------------+ 

Je voudrais être en mesure de chercher dans ce tableau pour un nom d'hôte complet (ie « www.google .com '). Si elle était l'inverse où la table contient l'URL complète j'utiliser:

SELECT * FROM table WHERE domain LIKE '%google.com%' 

Mais l'inverse est pas si simple. Ma pensée actuelle est de rechercher le nom d'hôte complet, puis de supprimer progressivement chaque partie du domaine, et de rechercher à nouveau. (c'est-à-dire rechercher 'www.google.com' puis 'google.com')

Ceci n'est pas particulièrement efficace ou intelligent, il doit y avoir une meilleure façon. Je suis sûr que c'est un problème commun, et sans aucun doute facile à résoudre!

Répondre

13

Vous pouvez utiliser la colonne à droite de trop comme:

SELECT domain FROM table WHERE 'www.google.com' LIKE CONCAT('%', domain); 

ou

SELECT domain FROM table WHERE 'www.google.com' LIKE CONCAT('%', domain, '%'); 

Il est pas particulièrement efficace, mais cela fonctionne.

+0

qui est si terrible qu'il est cool :-) –

+0

bien ou le mal ... ils sont tous les deux beaux choix. – Greg

+0

Cool. J'avais pensé à mettre le% avec le nom de la colonne, mais je ne savais pas comment concaténer comme ça. Merci. – Mat

0

Vous pouvez utiliser un peu de manipulation de chaîne SQL pour générer l'équivalent de string.EndsWith():

SELECT * FROM table WHERE 
substring('www.google.com', 
len('www.google.com') - len([domain]) , 
len([domain])+1) = [domain] 
2

En mysql vous pouvez utiliser des expressions régulières (RLIKE) pour effectuer des matches. Compte tenu de cette capacité que vous pourriez faire quelque chose comme ceci:

SELECT * FROM table WHERE 'www.google.com' RLIKE domain; 

Il semble que la voie RLIKE a été mis en œuvre, il est même assez intelligent pour traiter le point dans ce domaine (normalement un caractère générique dans regex) comme un point littéral. L'inclusion des expressions régulières vous donne une capacité très puissante pour analyser et rechercher des chaînes. Si vous souhaitez en savoir plus sur les expressions régulières, recherchez simplement "regex". Vous pouvez également utiliser un de ces liens:

http://en.wikipedia.org/wiki/Regular_expression

http://www.regular-expressions.info/

http://www.codeproject.com/KB/string/re.aspx

+0

Cela fonctionne très bien !! – HerrimanCoder

Questions connexes