2010-12-15 21 views
0

J'ai une colonne dans ma table appelée student_id, et je stocke les ID d'étudiant associés à un enregistrement particulier dans cette colonne, délimité par un caractère |. Voici des exemples d'entrées de deux des données dans cette colonne:MySQL: LIKE Aide à la requête?

243|244|245 
245|1013|289|1012 
549|1097|1098|245|1099 

J'ai besoin d'écrire une requête SQL qui renvoie des enregistrements qui ont un student_id de `245. Toute aide est la bienvenue.

Répondre

4

Ne pas stocker plusieurs valeurs dans le champ student_id car une seule valeur pour chaque intersection de ligne et de colonne est requise pour First Normal Form. C'est une bonne chose pour de nombreuses raisons, mais il est évident qu'elle résout d'avoir à traiter des cas comme student_id de "1245". Au lieu de cela, il serait préférable d'avoir une table séparée pour stocker les identifiants d'étudiants associés aux enregistrements dans cette table. Par exemple (vous voudriez ajouter des contraintes propres à cette définition de la table ainsi),

CREATE TABLE mytable_student_id (
    mytable_id INTEGER, 
    student_id INTEGER 
); 

Et vous pouvez alors interroger à l'aide d'une jointure:

SELECT * FROM mytable JOIN mytable_student_id 
    ON (mytable.id=mytable_student_id.mytable_id) WHERE mytable_student_id.student_id = 245 

Notez que puisque vous ne l'avez pas poster des détails de schéma concernant votre table d'origine autre que celui contenant un champ student_id, je l'appelle mytable pour les besoins de cet exemple (et en supposant qu'il a un champ de clé primaire appelé id - avoir une clé primaire est une autre exigence de 1NF).

+0

Je pense que cela devrait être 'WHERE mytable_student_id.student_id = 245' – LHMathies

0

@Donut a tout à fait raison à propos de la première forme normale: si vous avez une relation un-à-plusieurs, vous devez utiliser une table distincte, d'autres solutions conduisent à une publicité et un code non-supportable.

Mais si vous êtes confronté à des données qui sont en fait stockées comme ça, d'une manière commune de le faire est la suivante:

WHERE CONCAT('|',student_id,'|') LIKE '%|245|%'

0

Encore une fois, je suis d'accord avec Donut, mais cela est le bon requête à utiliser si vous ne pouvez rien faire à propos des données pour le moment.

WHERE student_id like '%|245|%' or student_id like '%|245' or student_id like '245|%' 

Cela prend soin de 245 étant au début, au milieu ou à la fin de la chaîne. Mais si vous n'êtes pas coincé avec cette conception, s'il vous plaît, faites s'il vous plaît ce que Donut recommande.