2010-04-09 9 views
4

J'ai un champ dans ma base de données qui contient des valeurs séparées par des virgules ces valeurs sont des nombres, et j'essaye de faire une recherche et de compter le nombre de fois qu'un nombre apparaît dans cette colonne la colonne,MySQL chercher un nombre dans le champ VARCHAR

$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '$sectorId'"; 

Cela semble lent et ne renvoie aucun résultat, et je sais que le sector_id est la recherche existe dans la table.

+0

Quelle est la valeur de $ sectorID? –

Répondre

2

Fondamentalement, cela fonctionne bien si vous utilisez % jokers:

WHERE sector_id_csv LIKE '%$sectorId%'"; 

ce qui a tendance à causer des problèmes dans ce scénario, cependant, est le fait que la recherche de 50 également trouver 501502503 et ainsi sur.

Si vous pouvez compter sur votre liste séparées par des virgules pour avoir une virgule finale derrière chaque entrée, il serait plus fiable pour rechercher

50,

pour attraper cette valeur uniquement.

+0

Ceci provoquera l'exécution de FULL TABLE SCAN. Sur de grandes tables, ce sera vraiment lent. –

+1

@FractalizeR yup. Je pense que cette approche sera lente, quoi que ce soit, la normalisation de la table accélérerait certainement les choses. Mais peut-être que c'est assez rapide - pour les petits projets, les données sont plus faciles à gérer de cette façon. –

+0

Merci pour la réponse a donné assez de base pour le faire fonctionner, la table ne sera jamais massive. –

1

Vous n'avez pas besoin de remplir la valeur avec le caractère générique % pour que LIKE fonctionne? Au moins c'est ce que j'ai compris à la lecture de cet article, votre utilisation de caractères génériques dépendra de votre condition désirée.

0

En fait, le numéro peut aussi être au début ou à la fin. Donc, vous devez faire

WHERE sector_id_csv='$sectorId' OR sector_id_csv LIKE '%,$sectorId' OR sector_id_csv LIKE '$sectorId,%' OR sector_id_csv LIKE '%,$sectorId,%' 
1

... mais si votre scema vous a été normalisé aurait pas besoin de sauter à travers ces cerceaux - et il courriez beaucoup plus vite.

C.

0
SELECT count(*) from TABLENAME where FIND_IN_SET('VALUE',FILDNAME)>0; 

Autres u peut utiliser instr regexp .... Il est conseillé d'avoir FILDNAME indexé.

2
WHERE CONCAT(',', sector_id_csv, ',') LIKE '%,$sectorId,%' 

ou

WHERE FIND_IN_SET('$sectorId', sector_id_csv); 

Cela garantira que votre requête ne renvoie que les lignes avec l'identifiant du secteur dans le domaine donné. À condition que les identifiants de secteur dans ce champ soient séparés par des virgules.

Toute requête utilisant LIKE ou FIND_IN_SET sera lente car elle ne peut pas tirer parti des index. Veuillez envisager de placer tous les identifiants de secteurs dans un tableau séparé.

également pour des raisons de sécurité s'il vous plaît veiller à ce que rappellent $ sectorId est un nombre en jetant à int comme ça:

$sectorId = (int)$sectorId; 

avant de l'utiliser dans une requête.