我在使用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。
谢谢
答案 0 :(得分:3)
正确的解决方案是重新设计表并规范化该字段,因此您将这些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
答案 1 :(得分:0)
我第二次(和第三次)认为您需要重新设计表格。也就是说,你也可以这样做:
WHERE CONCAT(';', catids, ';') LIKE '%;2;%'
答案 2 :(得分:0)
尝试使用REGEXP ...类似于......
SELECT * FROM mytable WHERE catids REGEXP '(\d|;|^)2;'