MySQL Select Statement,WHERE'IN'子句

时间:2009-10-18 21:33:04

标签: php sql mysql select

我目前在表格中有以下一行:

         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,3,5”列中。)

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

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

有关我在这里做错了什么的见解?感谢。

5 个答案:

答案 0 :(得分:13)

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

... WHERE column IN (1,2,3) 

而不是你使用它

... WHERE column IN ('1,2,3')

另见IN上的documentation,还有更多示例。

答案 1 :(得分:11)

您应该使用the like keyword来对char字段进行部分匹配:

where days like '%1%'

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

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

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
    )

(或者,那应该是关闭的;我不是完全确定你要完成什么或者你的架构的其余部分是什么样的,所以这是最好的猜测。)< / p>

答案 2 :(得分: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

但是你应该认真考虑规范化数据库,以便每天都有它自己的行。

答案 3 :(得分:2)

如果我正确理解您的问题,您希望将varchar字段的内容视为以逗号分隔的列表,并测试此列表是否不包含特定值。为此,您需要find_in_set(str, strlist)功能 但请记住,MySQL在这种情况下不能使用索引,并且您的查询将始终需要全表扫描。 可能最好不要在单个列中存储结构化数据(并对单个元素进行比较),而是使用其他响应中建议的另一个表和JOIN。

答案 4 :(得分:0)

天没有字符串列表。它包含一个字符串。字符串“1,3,5”是否在{'1'}中的一个字符串中?显然答案是否定的。要么将天重构到不同的表中,要么准备做更多的字符串操作