2010-11-09 4 views
0

Je le tableau suivant:Recherche d'enregistrements en faisant correspondre ensemble d'ID contre une virgule séparés ID dans un champ

Videos 
ID(Int) Industries(Varchar) 
11  3,5,8 
22  5 
33  1,3 

Et ceci est le résultat souhaité:

Search In Industry Field  Found IDs 
3        11,33 
1,8        11,33 
5        11,22 
1,5        11,22,33 
3,5,8       11,22,33 
1        33 
8        11 

Ce que je cherche est un moyen de trouver une requête qui le fera. find_in_set() est une bonne fonction mais ne fonctionnera pas car elle ne peut rechercher qu'un identifiant. Et je ne peux pas changer la structure de la table, aussi bien. Je peux mettre chaque identifiant dans find_in_set et en faire une boucle, mais je me demande si une meilleure approche est possible!

Merci,

+0

C'est ce que vous obtenez sans normalisation correcte. – Konerak

Répondre

1

Pouvez-vous OU différents FIND_IN_SET ensemble?

Search In Industry Field 3  
WHERE FIND_IN_SET(3,Industries) 

Search In Industry Field 1,8 
WHERE FIND_IN_SET(1,Industries) 
OR FIND_IN_SET(8,Industries) 
+0

Je viens de le faire de cette façon cependant. Cherchait à voir si une autre fonction (autre que find_in_set) est disponible. – code90

+1

Non, ça va. Si votre table est fortement lue et rarement écrite aussi, vous pouvez créer une table supplémentaire avec une normalisation appropriée qui utilise des index pour accélérer les lectures - mais les écritures auront le coût supplémentaire d'avoir à mettre à jour la table supplémentaire et d'être plus lent. S'il y a assez de lecture, puis d'écriture, la duplication pourrait l'emporter sur les coûts de maintenance. – Konerak

+0

Un autre IF: ** si ** votre ensemble de valeurs possibles est assez petit, vous pouvez les convertir en un masque de bits, et utilisez simplement des opérateurs logiques qui sont incroyablement rapides. Si votre type de colonne n'est pas VARCHAR mais SET, regardez la fonction 'EXPORT_SET'. – Konerak

0

Cela peut vous aider peut-être:

SELECT * FROM tableindustries LIKE '% andthenthevalue%'

Et puis faire cela pour chaque valeur recherchée en faisant exploser l'entrée de recherche par un virgule?

+0

'1,8' ne trouvera pas' 11' alors que '11' a' 3,5,8'. – Konerak

+0

Toujours ne fonctionnera pas. '3,5' trouvera' 11', mais '3,8' ne le sera pas. – Konerak

+0

Merci pour votre temps de toute façon .. – code90

Questions connexes