我们希望使用单个搜索框根据采购订单 ID(主键)或采购订单名称过滤采购订单。
我们使用 like 参数在 name 字段上进行搜索,但它似乎不适用于主键。它仅在我们对 id(s) 使用相等运算符时才有效。但是,如果我们可以使用 like for id(s) 过滤采购订单,那将是更可取的。这该怎么做?
create table purchase_orders (
id int(11) primary key,
name varchar(255),
...
)
我们希望使用单个搜索框根据采购订单 ID(主键)或采购订单名称过滤采购订单。
我们使用 like 参数在 name 字段上进行搜索,但它似乎不适用于主键。它仅在我们对 id(s) 使用相等运算符时才有效。但是,如果我们可以使用 like for id(s) 过滤采购订单,那将是更可取的。这该怎么做?
create table purchase_orders (
id int(11) primary key,
name varchar(255),
...
)
SELECT *
FROM purchase_orders
WHERE id LIKE '%123%'; -- tribute to TemporaryNickName
这太可怕了,性能方面:)
添加一个接收字符串版本的文本列id
。也许添加一些触发器来自动填充它。
id
将列的类型更改为CHAR
或VARCHAR
(我认为CHAR
应该首选主键)。
在两个 2a 中。和 2b。FULLTEXT
在这种情况下,向该列添加一个索引(可能是一个)。
我认为 LIKE 应该有效。我假设您的 SQL 编写不正确。假设您有订单名称“ABCDEF”,那么您可以使用以下查询结构找到它。
SELECT id FROM purchase_orders WHERE name LIKE '%CD%';
为了解释它, % 符号意味着它是一个通配符。结果,此查询将选择其中包含“CD”的任何字符串。
根据表结构,varchar 可以包含 255 个字符。我认为这是一个相当大的字符串,它可能会消耗大量资源,并且会花费更多时间来使用 SQL 函数(如LIKE )搜索某些内容。您可以随时通过 id 搜索它
WHERE id = something
. 顺便说一句,这是更快的方式
,但我不认为订单 ID 是用户友好的数据,而是让用户使用产品名称。我的建议是使用 apache Lucene 或者 MySQL 的全文搜索功能(可以提高搜索性能)。
这些工具旨在以更快的方式通过大字符串列表搜索特定模式或单词。许多网站使用它来构建自己的迷你搜索引擎。我发现mysql全文搜索功能几乎不需要学习曲线并且直接使用=D