MySQL SELECT WHERE LIKE 除了数字以外的任何内容

标签 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。

谢谢

最佳答案

正确的解决方案是重新设计您的表并规范化该字段,因此您将这些 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/

相关文章:

mysql - SELECT * FROM tbl WHERE clm LIKE CONCAT ('%' ,<other sql query LIMIT 1> ,'%' ) - 怎么做?

php - 将 JSON 数据插入 MySQL 表

mysql - 提高mysql查询的准确性

PHP + MySQL SQL语法错误

function - 在 Vim 中删除整个函数定义

mysql - 如何获取列 db_select 中的所有项目

javascript - 为什么 Angular 在正确更新模型时不通过向 ng-options 中的 <option> 标记添加 'selected' 属性来更新 DOM?

mysql - 如何过滤fname和lname? - mysql

mysql - SQL中的正则表达式检测一个或多个数字

MySQL - 如何将一个表中不同行的信息合并到另一个表中的一行中?