Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择除数字以外的任何内容_Mysql_Select_Sql Like - Fatal编程技术网

MySQL选择除数字以外的任何内容

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是从变量读取的。 我试着在它旁边使用一个不喜欢

我对使用LIKE子句的SELECT查询有一些问题。我需要获取某个字段中具有类别id的所有记录。所有类别ID的存储方式如下:

WHERE CONCAT(';', catids, ';') LIKE '%;2;%'
一,;2.4.11;12;22;32;

下面的查询

mytable
中选择*WHERE
catids
如“%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连接起来我不知道为什么在这种情况下您不使用两个主键,一个是as
id
,另一个是
catids
。然后,您可以执行类似于
的选择,其中CATID位于(1,2,4,11…
中,如果您想限制更多,您可以使用第一个
id
<代码>其中id在(1,2,3,4…)中,CATID在(1,2,4…)中等。您有很多可能更好地使用您的数据库。谢谢。这会奏效的。我知道这是一个非常丑陋的WHERE子句,但代码就是这样的,不能更改!非常感谢。这会奏效的。我知道这是一个非常丑陋的WHERE子句,但代码就是这样的,不能更改!