MySQL SELECT WHERE类似于数字

时间:2013-05-22 14:53:37

标签: mysql select sql-like

我在使用LIKE子句的SELECT查询时遇到了一些问题。我需要获取在某个特定字段中具有类别ID的所有记录。所有类别ID都存储如下:

1; 2; 4; 11; 12; 22; 32;

正在发生的是以下查询

  

SELECT * FROM mytable WHERE catids LIKE'%2;%'

将选择具有类别ID 2的所有记录,但也选择具有类别12,22,32等的记录。遗憾的是,用于存储类别ID的代码不可修改,并且从变量读取数字2。 我尝试在它旁边使用NOT LIKE子句但我不能重复10次以避免12,22,32,42等......

是否有人知道如何告诉LIKE条款获取%可以为空的任何内容;但不是一个数字?因为如果上面的示例中要获取的类别id为1,则字符串将以数字1开头(因此左侧没有;)但是它也将获取11。

谢谢

3 个答案:

答案 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;'