2009-06-05 7 views
2

J'ai des problèmes avec le sql ci-dessous. Fondamentalement, j'ai des lignes qui contiennent des chaînes selon le format: 129 & c = voitures. Je ne veux que les chiffres, par ex. 129. La requête SQL est la suivante:Sql: colonne de recherche qui commence par les chiffres

$result = mysql_query("SELECT * FROM " . $db_table . " WHERE id LIKE '" . $id . "%'"); 

Pourquoi% ne fonctionne-t-il pas? Je ne peux pas utiliser% ...% parce qu'il attrape trop.

+0

Je n'essaie pas d'être un smartass, mais attention lors de la construction de la requête: Si id vient directement d'un utilisateur, vous fournir une porte ouverte à l'injection SQL. – balpha

+0

Que voulez-vous dire% ne fonctionne pas? Ne sélectionne-t-il pas les lignes que vous attendiez? – Jack

+0

non, il correspond à la mauvaise ligne. L'ID 26 est donc associé à 136. –

Répondre

1

Je recommanderais en fait d'utiliser des expressions régulières pour la correspondance, mais malheureusement, il n'y a aucun moyen de capturer la partie correspondante avec mysql. Vous devrez faire l'extraction en php. Si vous avez un tableau contenant tous les résultats appelés $array:

$array = preg_replace('/^(\d+).*/', '$1', $array); 
+0

est $ array identique à ma variable appelée $ result? –

+1

Cela a fonctionné - merci! Le problème est que je récupère la table entière et je me demande si la requête peut être optimisée d'une façon ou d'une autre. –

+0

Vous pouvez utiliser l'instruction limit si vous voulez juste certaines lignes: http://php.about.com/od/mysqlcommands/g/Limit_sql.htm – soulmerge

1

Vous pouvez utiliser la substance MySQL « regexp » dans la clause WHERE pour réduire la quantité de données récupérées à seulement les lignes que vous voulez. La base pour de votre requête ressemblerait à ceci:

SELECT * FROM table WHERE field REGEXP '^$id&' 

où $ id est inséré par PHP et les données que vous voulez est toujours au début du champ et suivi d'un &. Si ce n'est pas le cas, ajustez l'expression rationnelle en conséquence, bien sûr.

Le moteur de regex de MySQL ne peut malheureusement pas effectuer de capture, vous devrez donc faire un peu d'analyse en PHP comme l'a montré soulmerge ci-dessus, mais avec la commande 'where regexp' dans MySQL, vous n'aurez qu'à traiter avec les lignes que vous connaissez contiennent les données que vous voulez, pas toute la table.

0

En utilisant une requête comme ceci:

SELECT * 
FROM mytable 
WHERE id >= '0' COLLATE UTF8_BIN 
     AND id < ':' COLLATE UTF8_BIN 

retournera toutes les chaînes qui commencent par un chiffre et faites votre expression sargable, i. e. et l'index sur id peut être utilisé.

Cela accélèrera l'exécution de votre requête.

Questions connexes