MySQL选择除数字以外的任何内容
我对使用LIKE子句的SELECT查询有一些问题。我需要获取某个字段中具有类别id的所有记录。所有类别ID的存储方式如下:MySQL选择除数字以外的任何内容,mysql,select,sql-like,Mysql,Select,Sql Like,我对使用LIKE子句的SELECT查询有一些问题。我需要获取某个字段中具有类别id的所有记录。所有类别ID的存储方式如下: WHERE CONCAT(';', catids, ';') LIKE '%;2;%' 一,;2.4.11;12;22;32; 下面的查询 从mytable中选择*WHEREcatids如“%2;” 将选择具有类别id 2的所有记录,但也选择具有类别12、22、32等的记录。不幸的是,用于存储类别id的代码不可修改,并且数字2是从变量读取的。 我试着在它旁边使用一个不喜欢
WHERE CONCAT(';', catids, ';') LIKE '%;2;%'
一,;2.4.11;12;22;32;
下面的查询
从mytable
中选择*WHEREcatids
如“%2;”
将选择具有类别id 2的所有记录,但也选择具有类别12、22、32等的记录。不幸的是,用于存储类别id的代码不可修改,并且数字2是从变量读取的。
我试着在它旁边使用一个不喜欢的子句,但为了避免12、22、32、42等等,我不能重复10次
是否有人知道如何告诉子句要获取任何包含%的内容,这些内容可以是空的,也可以是空的;但不是一个数字?因为在上面的示例中,如果要获取的类别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
正确的解决方案是重新设计表并规范化该字段,以便将这些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
我支持(和第三)您需要重新设计表的想法。也就是说,你也可以这样做:
WHERE CONCAT(';', catids, ';') LIKE '%;2;%'
我支持(和第三)您需要重新设计表的想法。也就是说,你也可以这样做:
WHERE CONCAT(';', catids, ';') LIKE '%;2;%'
尝试使用REGEXP。。。类似于
SELECT * FROM mytable WHERE catids REGEXP '(\d|;|^)2;'
尝试使用REGEXP。。。类似于
SELECT * FROM mytable WHERE catids REGEXP '(\d|;|^)2;'
您可以将数据存储为;1.2.4.11;12;22;32; 在开始时添加额外的分隔符,并将查询更改为类似“%”;2;%为什么数据库的设计方式使使用它成为可能?最好重新组织表,以避免将值存储在一个字段中。使用这种方式链接表不是一个好主意。您应该使用单独的表将mytable与category table连接起来我不知道为什么在这种情况下您不使用两个主键,一个是as
id
,另一个是catids
。然后,您可以执行类似于的选择,其中CATID位于(1,2,4,11…
中,如果您想限制更多,您可以使用第一个id
<代码>其中id在(1,2,3,4…)中,CATID在(1,2,4…)中等。您有很多可能更好地使用数据库。您可以将数据存储为;1.2.4.11;12;22;32; 在开始时添加额外的分隔符,并将查询更改为类似“%”;2;%为什么数据库的设计方式使使用它成为可能?最好重新组织表,以避免将值存储在一个字段中。使用这种方式链接表不是一个好主意。您应该使用单独的表将mytable与category table连接起来我不知道为什么在这种情况下您不使用两个主键,一个是asid
,另一个是catids
。然后,您可以执行类似于的选择,其中CATID位于(1,2,4,11…
中,如果您想限制更多,您可以使用第一个id
<代码>其中id在(1,2,3,4…)中,CATID在(1,2,4…)中等。您有很多可能更好地使用您的数据库。谢谢。这会奏效的。我知道这是一个非常丑陋的WHERE子句,但代码就是这样的,不能更改!非常感谢。这会奏效的。我知道这是一个非常丑陋的WHERE子句,但代码就是这样的,不能更改!