8768 sujets

Développement web côté serveur, CMS

Bonjour,

Dans une table, j'ai une champ qui peut contenir plusieurs Identifiants séparés par des virgules.
Par exemple: "1,10,5"

Et je cherche une commande MySQL qui me permettrait de vérifier si un identifiant donné est présent dans ce champ.
En gros, c'est l'inverse de la commande IN (SELECT * FROM table WHERE id IN $myList).

Actuellement, je fais cela:
SELECT * from TABLE WHERE myList= '$id' OR myList LIKE '%$id,%' OR myList LIKE '%,$id%'

Cela me permet de traiter tout les cas (je crois) de valeurs possibles dans mon champ, mais ca me parait compliqué.

Si vous connaissiez plus simple, je finirai la journée moins bête.

Merci pour votre aide

Marco
Modérateur
Bonjour,

@limipl : marche pas car si par exemple $id=1, tu vas sélectionner des lignes comme 2,10,5.

Amicalement,
Modérateur
Bonjour,

@pifoux : tu peux le faire avec un regex, mais ce n'est pas forcément plus simple. A toi de juger !

$query='SELECT * from TABLE WHERE myList REGEXP \'^([0-9]+,)*'.$id.'(,[0-9]+)*$\'';

EDIT : je m'aperçois à l'instant qu'en fait ton SELECT ne marche pas pour les mêmes raisons que pour limipl. Si $id=1, tu vas sélectionner des lignes comme 2,10,5.

Amicalement,
Modifié par parsimonhi (23 Jan 2016 - 14:10)
Modérateur
Salut,

pifoux a écrit :

En gros, c'est l'inverse de la commande IN (SELECT * FROM table WHERE id IN $myList).


Suivant l'exemple/solution que tu donnes, non ce n'est pas NOT IN / IN ou NOT LIKE / LIKE ou NOT REGEXP/REGEXP qu'il te faut. Je te rappelle que l'opérateur de logique IN permet de sélectionner (plus rapidement / facilement) les valeurs identiques d'un attribut d'une table (évite une requête de X lignes avec OR sur le même attribut).
En exemple, tu as une table "utilisateurs". Dans cette table, il y a un champ "nom". Plusieurs lignes ont cette donnée : Durand, Dupont, Martin, Berger, etc. Tu souhaites récupérer tous les utilisateurs ayant pour nom 'Durand' OU 'Dupont' OU 'Martin'.

Ça se passe ainsi :

SELECT
    prenom,
    nom 
FROM 
    utilisateurs 
WHERE 
    nom IN('Durand','Dupond', 'Martin');


En gros, c'est le raccourci de cette même requête :

SELECT
    prenom,
    nom 
FROM 
    utilisateurs 
WHERE 
    nom = 'Durand'
OR
    nom = 'Dupond'
OR
    nom = 'Martin'



pifoux a écrit :
Si vous connaissiez plus simple, je finirai la journée moins bête.


Plus simple, ce n'est pas évident de te répondre. Ton LIKE fait mal à la tête.... (performance et mauvaise pratique) Smiley ohwell De toute évidence ta table n'a pas de forme normalisée. L'une des règle de la première forme normalisée est que tu aies des valeurs atomiques/canoniques pour chaque attribut de la table. Je sais, c'est très subjectifs, mais ce sont suivant les besoins d'utilisation (l'organisation des données dans une base). Smiley cligne De toute évidence également, ce sont des données redondantes. Là encore, tu vas à l'encontre de la première forme normalisée. Suivant l'exemple que tu donnes, tu as/auras des doublons et des problèmes de performance pour des requêtes aussi basiques.

Je t'invite à consulter google ou autres afin que tu saches comment modéliser et de mieux comprendre ce que j'essaie de t'expliquer.

++
Modifié par niuxe (23 Jan 2016 - 16:08)
Merci à tous et désolé pour le retard.


Merci parsimonhi, le REGEXP marche super bien et effectivement ma clause WHERE ne marchait pas bien

Niuxe, oui, je sais tout ca, mais je ne voulais pas m'embêter à gérer 2 tables car plus tard je vais devoir gérer des clauses WHERE plus complexe et c'est à ce moment (front end) que je pense gagner en performance et en lisibilité (maintenance), mais merci pour tes explications et ton aide.

Marco