2011-11-11 2 views
2

Je sais que je peux utiliser IN (1,2,3) pour sélectionner des éléments d'une base de données SQL où leur valeur est 1, 2 ou 3, mais que faire si j'ai une valeur dans MYSQL qui est une chaîne, et est égal à '1,2,3' et je veux sélectionner cette valeur. Pour autant que je sais que je dois faire:Comment stocker et rechercher dans CSV en SQL?

SELECT whatever FROM wherever WHERE sqlvariable = '1' OR sqlvariable LIKE '1,%' OR `sqlvariable` LIKE '%,1,%' OR `sqlvariable` LIKE '%,1' 

ce qui est bien si je veux simuler « IN » de sorte en sens inverse. Mais laisse dire que je veux sélectionner sqlvariable où il contient 1 ou 2, alors je dois le faire:

SELECT whatever FROM wherever WHERE sqlvariable = '1' OR sqlvariable LIKE '1,%' OR `sqlvariable` LIKE '%,1,%' OR `sqlvariable` LIKE '%,1' OR sqlvariable = '2' OR sqlvariable LIKE '2,%' OR `sqlvariable` LIKE '%,2,%' OR `sqlvariable` LIKE '%,2' 

Maintenant, supposons que j'utilise PHP pour générer les requêtes ci-dessus et je suis à la recherche de trouver sqlvariable où il contient un 1 2 4 66 34 33 22 44 ou 992. Il faudra beaucoup de temps pour que cette requête s'exécute.

Je pourrais faire une implémentation au niveau du bit, mais alors je suis limité à seulement environ 60 éléments différents, ce qui n'est pas suffisant.

Existe-t-il un moyen plus rapide d'utiliser une requête CSV comme ci-dessus en SQL? Je suppose que c'est un peu comme IN() mais en sens inverse.

+0

J'espère que vous ne stockez pas réellement CSV chaînes dans votre base de données SQL! Et si vous êtes, j'espère que vous pouvez convaincre votre patron ou DBA d'être un peu plus intelligent et * analyser * le fichier .csv avant de le * stocker *. – paulsm4

+0

Je n'ai pas de patron, je suis juste un Canadien qui essaie d'apprendre monsieur: P Merci pour vos commentaires cependant, j'essaie en effet d'apprendre une meilleure approche pour stocker des tableaux dans des bases de données. Je sais que les forums vBulletin stockent par exemple des informations sur les groupes de permissions sous la forme d'une chaîne CSV. Par exemple, une variable d'autorisations sur un forum vbulletin ressemble à «1,2,3» où chaque nombre représente un groupe d'autorisations différent. Comment devrait-il être mieux fait? – Macmee

Répondre

4

Vous pouvez simplifier vos requêtes à l'aide FIND_IN_SET:

SELECT whatever 
FROM wherever 
WHERE FIND_IN_SET('1', sqlvariable) 
OR  FIND_IN_SET('2', sqlvariable) 

Ceci, cependant, il faudra encore chercher toutes les lignes de la table. Il serait préférable de revoir votre base de données afin que les données au format CSV ne soient pas nécessaires.


Mise à jour: Votre conception actuelle ressemble à quelque chose comme ceci:

groupname groupmembers 
Group1  1,2,3 
Group2  3,4 

Vous devriez changer quelque chose de plus comme ceci:

groupid groupmember 
1   1 
1   2 
1   3 
2   3 
2   4 
+0

Merci! Comment pourrais-je repenser ma table. J'ai une table qui regroupe les utilisateurs dans différents groupes d'utilisateurs. Pour stocker la liste des utilisateurs qui appartiennent à un groupe d'utilisateurs en ce moment j'ai un tableau avec deux valeurs, 'groupname', 'groupmembers'. Puisque parfois plus de 100 utilisateurs peuvent être dans les membres du groupe, je ne suis pas sûr de savoir comment les stocker autrement que d'utiliser CSV et d'avoir quelque chose comme '1,2,3,4,5,6' comme valeur pour les membres du groupe où chaque numérique représente un utilisateur . – Macmee

Questions connexes