[英]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.