MySQL Select Statement,WHERE'IN'子句

Dod*_*nas 7 php mysql sql select

我目前在表中有以下行:

         course_data:
             user_id        days     <-- This is a varchar column.
               405          1,3,5
Run Code Online (Sandbox Code Playgroud)

我正在尝试实现以下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
Run Code Online (Sandbox Code Playgroud)

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

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

但是,我没有发现这种情况.尽管如此$day = "1",它仍然会返回那一行.

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

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

the*_*ega 13

删除IN语句中的引号.语法是:

... WHERE column IN (1,2,3) 
Run Code Online (Sandbox Code Playgroud)

而不是你使用它

... WHERE column IN ('1,2,3')
Run Code Online (Sandbox Code Playgroud)

另请参阅IN 的文档,还有更多示例.


Jam*_*lis 11

您应该使用like关键字做煤焦领域的一个部分匹配:

where days like '%1%'
Run Code Online (Sandbox Code Playgroud)

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

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

course_data:
    user_id

course_days:
    user_id
    day_number
Run Code Online (Sandbox Code Playgroud)

然后,您将获得以下数据:

course_data:
    user_id
    405

course_days
    user_id    day_number
    405        1
    405        3
    405        5
Run Code Online (Sandbox Code Playgroud)

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

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
    )
Run Code Online (Sandbox Code Playgroud)

(或者,这应该是接近,我不准确确定你想要什么来完成或你的架构其余的样子,所以这是一个最好的猜测).


Luk*_*ský 5

我认为你想要的查询是:

SELECT usrID, usrFirst, usrLast, usrEmail
FROM tblUsers
WHERE usrID NOT IN (
    SELECT user_id 
    FROM course_data
    WHERE find_in_set(?, days) > 0
)
ORDER BY usrID
Run Code Online (Sandbox Code Playgroud)

但是你应该认真考虑规范化数据库,这样每天都有自己的行.