2010-11-16 6 views
0

J'essaie de faire une instruction select simple sur une base de données mysql. Dans MsSql cela fonctionne bien, mais je ne peux pas le faire fonctionner dans MySQL.Sélectionnez l'instruction MySql

Ce que je veux faire est la suivante:

Disons que je une table (nommée TestTable) comme ceci:

ID  | DOMAIN    | NrOfVisitors 
-------------------------------------------- 
1  | something.com  | 435 
-------------------------------------------- 
2  | blabla.com   | 231 

Et j'ai une chaîne, comme http://bla.ttt.something.com/blabla

maintenant Je veux passer dans la chaîne, et sélectionnez les lignes où le domaine est dans la chaîne. En MsSQL je peux faire ce qui suit:

SELECT * 
    FROM TestTable 
    WHERE "http://bla.ttt.something.com/blabla" LIKE "%" DOMAIN "%" 

Mais dans MySql il retourne 0 lignes. Qu'est-ce que je fais mal?

Merci d'avance!

+0

Peut-être que vous devriez extraire l'hôte d'abord. Cela rendra la recherche plus facile. – Gumbo

Répondre

3
SELECT * FROM TestTable WHERE "http://bla.ttt.something.com/blabla" LIKE CONCAT("%",DOMAIN,"%") 
+0

Wow merci: D J'ai oublié le CONCAT: D – CyberK

2

Eh bien, la première étape d'une solution robuste serait d'extraire le domaine de la chaîne (en utilisant parse_url):

$string = 'http://bla.ttt.something.com/blabla'; 
$domain = parse_url($string, PHP_URL_HOST); 

Ensuite, vous supposant que vous voulez faire correspondre les deux niveaux supérieurs de le seul domaine (something.com), vous devez extraire que du domaine ...

$parts = explode('.', $domain); 
$top2parts = array_slice($parts, -2); 
$rootDomain = implode('.', $top2parts); 

Ensuite, nous construisons la requête:

$sql = "SELECT * 
    FROM TestTable 
    WHERE domain LIKE '%".mysql_real_escape_string($rootDomain)."%'"; 

Cela devrait le faire pour vous. Pour l'entrée donné, il va générer:

SELECT * 
    FROM TestTable 
    WHERE domain LIKE '%something.com%' 

Bien sûr, vous pourriez le faire dans l'autre sens, et la recherche par concating wildcards au domaine:

SELECT * 
    FROM TestTable 
    WHERE CONCAT('%', domain, '%') LIKE 'http://bla.ttt.something.com/blabla' 

Mais le problème qui est montré par l'URL de l'exemple: http://foo.bar/blah/something.com.html ... Qui retournera un faux positif pour something.com puisque c'est dans l'URL, mais ce n'est pas dans le domaine ... Donc, une méthode pour éviter cela (tout en cherchant toujours le domaine complet) serait pour faire une combinaison:

$string = 'http://bla.ttt.something.com/blabla'; 
$domain = parse_url($string, PHP_URL_HOST); 
$sql = "SELECT * 
    FROM TestTable 
    WHERE CONCAT('%', domain, '%') LIKE '".mysql_real_escape_string($domain)."'"; 

Ce qui dans ce cas va générer:

SELECT * 
    FROM TestTable 
    WHERE CONCAT('%', domain, '%') LIKE 'bla.ttt.something.com'