我在使用 LIKE 子句的 SELECT 查询时遇到了一些问题。我需要获取在某个特定字段中具有类别 ID 的所有记录。所有类别 id 都这样存储:
1;2;4;11;12;22;32;
发生的是以下查询
SELECT * FROM
mytable
WHEREcatids
LIKE '%2;%'
将选择类别 ID 为 2 的所有记录以及类别为 12、22、32 等的记录。不幸的是,用于存储类别 ID 的代码不可修改,数字 2 是从变量中读取的。 我尝试在它旁边使用 NOT LIKE 子句,但我不能重复它 10 次以避免 12、22、32、42 等...
有没有人知道如何告诉子句 LIKE 获取任何带有 % 可以为空或 ; 的东西?但不是数字?因为如果要获取的类别 ID 在上面的示例中是 1,则字符串将以数字 1 开头(因此它不会在左侧有一个 ;),但它也会获取 11。
谢谢
最佳答案
正确的解决方案是重新设计您的表并规范化该字段,因此您将这些 ID 存储在一个子表中,每个记录一个 ID。然后你的问题就消失了。
否则,您将需要一个丑陋的 WHERE 子句来处理所有可能的情况:
WHERE
catids = 2 // the only ID in the field
OR catids LIKE '2;%' // ID is at the START of the id list
OR catids LIKE '%;2;%' // ID is somewhere in the MIDDLE of the list
OR catids LIKE '%;2' // ID is at the END of the list
如果您有一个适当规范化的设计,该子句将只是
WHERE subtable.catids = 2
关于MySQL SELECT WHERE LIKE 除了数字以外的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16695049/