php – MySQL Select Statement,WHERE’IN’子句

我目前在表中有以下行:
course_data:
             user_id        days     <-- This is a varchar column.
               405          1,3,5

我正在尝试实现以下SELECT语句:

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

基本上,如果$day变量包含’1,3或5′,我希望省略该行(用户405).

例如,如果$day =“1”,它应该返回一个查询(因为数字“1”在列“1,5”中).

但是,我没有发现这种情况.即使$day =“1”,它仍会返回该行.

它不会返回行的唯一方法是$day =“1,5”.然而,我认为IN()子句将接受我的变量的任何部分并将其应用于该列.

在这里做错了什么见解?谢谢.

您应该使用 the like keyword来进行char字段的部分匹配:
where days like '%1%'

编辑:VolkerK和Lukas Lalinsky都建议使用MysqL的find_in_set,这可能比你想做的更好.但是,以下有关规范化数据库的建议仍然适用.

但是,您不应在单个数据库字段中存储多个值.相反,请考虑使用两个表:

course_data:
    user_id

course_days:
    user_id
    day_number

然后,您将拥有以下数据:

course_data:
    user_id
    405

course_days
    user_id    day_number
    405        1
    405        3
    405        5

然后,您可以正确查询此架构.例如:

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
    )

(或者,这应该是关闭的;我不确定你要完成什么或者你的模式的其余部分是什么样的,所以这是最好的猜测).

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...