7
votes

MySQL Sélectionnez une déclaration, où 'in' clause

J'ai actuellement la ligne suivante dans ma table: xxx pré>

et j'essaie d'implémenter l'instruction SELECT suivante: P>

SELECT usrID, usrFirst, usrLast, usrEmail
    FROM tblUsers
    WHERE usrID NOT IN
    (
        SELECT users.usrID
            FROM
                `course_data` courses,
                `tblUsers` users
            WHERE
                days IN ('$day')
    )
    GROUP BY usrID
    ORDER BY usrID


0 commentaires

5 Réponses :


13
votes

Supprimer les guillemets dans la déclaration dans. La syntaxe est la suivante: xxx

et non comme vous l'avez utilisé xxx

Voir aussi le Documentation sur, il y a plus d'exemples.


3 commentaires

En fait, désolé, j'ai besoin de clarification. Je fais quelque chose de mal ici. Si j'utilise: où des jours dans (1), il l'enlève correctement et renvoie un résultat vide. Mais si j'utilise: où des jours de (3), il ne renvoie pas une requête vide. Je penserais qu'il devrait supprimer la requête parce que '3' est dans la requête? Des idées?


Je suppose que c'est parce qu'il convertit "1,3,5" dans un int (s'arrêter à la virgule), puis voit qu'elle correspond.


Je ne sais pas pourquoi ce n'est pas la réponse acceptée pour le scénario donné dans le poste d'origine - bien que j'accepte que la réponse acceptée fournit des conseils sur la correction des mauvaises habitudes de codage.



0
votes

jours ne tient pas une liste de chaînes. Il contient une seule chaîne. La chaîne "1,3,5" est-elle dans l'une des cordes de {'1'}? Clairement la réponse est non. Soit des jours de refacteur dans une table différente ou être prêt à faire plus de manipulation de chaîne


0 commentaires

11
votes

Vous devez utiliser Le comme Code> Mot-clé Pour faire une correspondance partielle du champ de caractère:

select  cd.user_id
from    course_data as cd
where   cd.user_id not in
    (
        select  course_days.user_id
        from    course_days
        where   course_days.user_id = cd.user_id
            and course_days.day_number = 1
    )


3 commentaires

Merci. Vous avez raison de changer la structure. Je suis allé de l'avant et je l'ai fait. Merci.


"Donc, c'est une meilleure estimation": une autre idée (faisable possible) est d'utiliser une sous-requête non existante comme décrit à dev.mysql.com/doc/refman/5.1/fr/... au lieu de x non in (sous-requête)


% comme% donneraient 11 pour une recherche de 1, donc cela ne convient pas vraiment, donc cette réponse ne s'applique pas vraiment à la question initiale. La réponse de Theoméga semble plus applicable à l'OP.



2
votes

Si je comprends votre question correctement, vous souhaitez que le contenu du champ Varcharne soit traité comme une liste séparée par des virgules et testez si cette liste ne contient pas de valeur certaine. Pour cela, vous avez besoin du Find_in_set (str , Strlist) fonction.
Mais gardez à l'esprit que MySQL ne peut pas utiliser un index dans ce cas et votre requête aura toujours besoin d'une table complète. Il peut être préférable de ne pas stocker de données structurées (et de faire des comparaisons sur les éléments simples) dans une seule colonne, mais d'utiliser une autre table et une jointure comme a été suggérée dans d'autres réponses.


0 commentaires

5
votes

Je pense que la requête que vous voulez est: xxx

mais vous devez envisager sérieusement de normaliser la base de données, de sorte que chaque jour a sa propre ligne.


0 commentaires