mysql IN()

mysql IN() - SQL/NoSQL - Programmation

Marsh Posté le 20-09-2011 à 12:18:00    

Bonjour,
 
Je me cogne sur un petit problème en ce moment.
 
J'ai une table "produits", avec (entre autre) une colonne "document_id", écrite sous la forme de "id1, id2, [...] , id3" (par exemple "6,5,3,2,4". A coté, j'ai une table documents, avec des id bien entendu.
 
J'aurai sans doute du faire une table intermédiaire pour assigner les documents aux produits, mais bon, maintenant c'est fait.
 
Ma question : je comptais utiliser la fonction "IN()" pour récupérer les produits à partir d'une id de document :

Code :
  1. SELECT * FROM produits WHERE "5" IN (produits.document_id)


 
bon, ça marche pas (aucun retour), donc évidemment je dois rêver un peu sur le fonctionnement de IN. Mais je voulais une confirmation comme quoi je fais de la merde, parce que toutes les docs que je retrouve ont l'air de présenter IN() de cette manière..
 
Du coup, sinon, une idée comme obtenir ce dont j'ai besoin autrement? Genre une regexp par exemple?
 
Merci bien en tout cas :D


---------------
| .:: www.wizopunk-art.com - Développement web ::. |
Reply

Marsh Posté le 20-09-2011 à 12:18:00   

Reply

Marsh Posté le 20-09-2011 à 13:38:56    

ta structure de base de données est pas top ( et je suis gentil )  
Est ce que tu ne peux pas avoir une table produits_document(produit_id,document_id)  ?  
 
Sinon, la méthode simple est de rechercher avec des expressions régulières , mais c'est moche .  
 
Sinon IN s'utilise plutot comme ça :  
SELECT * FROM produits WHERE   produits.document_id IN (5,8 , 23, 214)


---------------

Reply

Marsh Posté le 20-09-2011 à 15:33:46    

+1 pour le pb de modélisation. T'es typiquement dans le cas d'une relation 1..n et cette relation n'est pas modélisé correctement dans ta BD, d'où ton pb... :/ En général, avec une BD bien modélisée, les requêtes s'écrivent assez facilement (quand on se débrouille un minium en SQL, of course :D )...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 20-09-2011 à 16:43:06    

flo850 a écrit :

ta structure de base de données est pas top ( et je suis gentil )  
Est ce que tu ne peux pas avoir une table produits_document(produit_id,document_id)  ?  
 
Sinon, la méthode simple est de rechercher avec des expressions régulières , mais c'est moche .  
 
Sinon IN s'utilise plutot comme ça :  
SELECT * FROM produits WHERE   produits.document_id IN (5,8 , 23, 214)


Bon pour l'instant je m'en suis sortit avec un regexp, mais c'est vrai que c'est du bricolage. Je suis d'accord sur mon problème de modélisation. Bon là ça va que c'est une partie qui n'est pas publique, et du coup il n'y a pas de traffic là dessus. Il a été décidé de le laisser comme ça pour l'instant :)
 
Mais sinon oui, il faudrait que je fasse ça correctement la prochaine fois.. Merci pour la réponse :)


---------------
| .:: www.wizopunk-art.com - Développement web ::. |
Reply

Marsh Posté le 20-09-2011 à 16:43:41    

rufo a écrit :

+1 pour le pb de modélisation. T'es typiquement dans le cas d'une relation 1..n et cette relation n'est pas modélisé correctement dans ta BD, d'où ton pb... :/ En général, avec une BD bien modélisée, les requêtes s'écrivent assez facilement (quand on se débrouille un minium en SQL, of course :D )...


ouais, bien d'accord :D
Bon aller ça saoule, je vais mettre ça en place comme ça ça ira mieux à l'avenir!


---------------
| .:: www.wizopunk-art.com - Développement web ::. |
Reply

Marsh Posté le 20-09-2011 à 17:47:21    

T'as tout à fait raison de remettre ça d'équerre si t'en a la possibilité. C'est perdre un peu  de temps, là, pour en gagner par la suite ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed