2010-05-16 5 views
0

j'ai une requête MySQL qui obtient notamment des vars comme ça:Obtenir des lignes qui comprennent une valeur avec MySQL

messages récepteur TABLE Col.

  • util_1 lignes: 1,3,5
  • lignes de user2: 2,3
  • USER3 rangées: 1,4

Je souhaite obtenir des lignes qui incluent la valeur '3'. Donc j'obtiendrai 'user1' et 'user2'.

J'ai essayé mais cela ne marche pas.

mysql_query("SELECT * FROM messages WHERE receiver='3'"); 

Comment est-ce que je peux faire ceci?

+0

Veuillez nous donner plus d'informations sur les champs de la table des messages. Le plus évidemment, nous devons connaître le type de données de 'récepteur'. Est-ce une chaîne (essayez la réponse de @Sarfaz) ou est-ce numérique (essayez ma (@lexu) réponse)? – lexu

Répondre

3

Essayez ceci:

mysql_query("SELECT * FROM messages WHERE receiver like '%3%'"); 
+0

Que faire si une ligne contient "13,30,33"? Votre requête va correspondre et elle ne devrait pas. – Asaph

+0

@Asaph: Si nous sommes uniquement intéressés par '3', nous pourrions faire comme' mysql_query ("SELECT * FROM messages WHERE récepteur comme '%, 3,%'"); 'car comme on peut le voir chaque valeur est séparée par une virgule. – Sarfraz

+0

@Sarfaz: Cette stratégie échoue sur les entrées "3" ou "3,7" ou "1,3" suivantes. – Asaph

0

La meilleure façon serait de restructurer votre base de données.

ont une table messages avec id, text, etc., une table receivers avec id, name et une table msg2rec (ou comme vous voulez l'appeler) avec id_msg et id_rec.

De cette façon, vous pouvez faire:

SELECT m.text, r.name 
FROM msg2rec m2r 
LEFT JOIN messages m ON m2r.id_msg = m.id 
LEFT JOIN receivers r ON m2r.id_rec = r.id 
WHERE m2r.id_rec = 3 

Sinon, si vous gardez votre structure, vous devez utiliser:

SELECT text 
FROM messages 
WHERE rec RLIKE (",3,") OR rec RLIKE("^3,") OR rec RLIKE(",3$") 

Il y a probablement une expression rationnelle unique qui fait la même chose que le 3 dessus, mais je ne peux pas le comprendre maintenant. Quoi qu'il en soit, je voudrais aller avec la première option: plus propre, plus facile à mantenir et de travailler avec

2

Comme d'autres l'ont mentionné, en essayant de rechercher des données dénormalisées « 1,2,3,4,44,5,55 » dans une base de données relationnelle n'est pas une bonne approche. Les bases de données relationnelles sont construites pour gérer les données normalisées.

Vous pourriez .. noter, pourrait diviser la chaîne en un sous-ensemble (Split function in MySQL), puis faire une opération IN-search, mais ce n'est pas une approche recommandée.

La meilleure façon de résoudre le problème est d'en haut. Depuis essayer de construire autour de lui, au lieu de réellement le réparer, n'est jamais une bonne voie à suivre.

La solution; Normaliser les données.

Message 
- [PK] Id 
- Body... 

Reciever 
- [PK] Id 
- Name... 

MessageReceiver 
- [FK] MessageId 
- [FK] ReceiverId 

Avoir cette structure de table, vous pouvez facilement requête:

SELECT M.* FROM MessageReceiver MR 
INNER JOIN Message M ON M.Id=MR.MessageId 
WHERE MR.ReceiverId=3 

Résolution de cette façon vous permettra d'économiser beaucoup de maux de tête à l'avenir.

Questions connexes