簡體   English   中英

MySQL Select陳述式,WHERE'IN'子句

[英]MySQL Select Statement, WHERE 'IN' Clause

目前,我的表中包含以下行:

         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()子句會占用變量的任何部分並將其應用於該列。

對我在這里做錯的任何見解嗎? 謝謝。

刪除IN語句中的引號。 語法為:

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

而不是像你以前那樣

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

另請參閱有關IN的文檔 ,還有更多示例。

您應該使用like關鍵字對char字段進行部分匹配:

where days like '%1%'

編輯:VolkerK和盧卡斯·拉林斯基都表明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
    )

(或者,這應該是接近,我不完全相信你想要什么來完成或者什么休息您的架構看起來像,所以這是一個最好的猜測)。

我認為您想要的查詢是:

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

但是您應該認真考慮對數據庫進行規范化,以便每一天都有自己的行。

如果我正確理解了您的問題,則希望將varchar字段的內容視為以逗號分隔的列表,並測試此列表是否不包含某個值。 為此,您需要find_in_set(str,strlist)函數。
但是請記住,在這種情況下,MySQL無法使用索引,並且您的查詢將始終需要全表掃描。 be better not to store structured data (and run comparisons on the single elements) in a single column but to use another table and a JOIN as has been suggested in other responses. 是最好不要(對單一要素和運行比較),結構化數據存儲在一個單一的列,但使用另一個表和已在其他回應有人提出一個JOIN。

天不包含字符串列表。 它包含一個字符串。 字符串“ 1,3,5”是否位於{'1'}中的字符串之一中? 顯然答案是否定的。 要么將天重構到另一個表中,要么准備進行更多的字符串操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM