0

我们希望使用单个搜索框根据采购订单 ID(主键)或采购订单名称过滤采购订单。

我们使用 like 参数在 name 字段上进行搜索,但它似乎不适用于主键。它仅在我们对 id(s) 使用相等运算符时才有效。但是,如果我们可以使用 like for id(s) 过滤采购订单,那将是更可取的。这该怎么做?

create table purchase_orders (
id int(11) primary key,
name varchar(255),

...
)
4

2 回答 2

0

选项1

SELECT *
FROM purchase_orders
WHERE id LIKE '%123%'; -- tribute to TemporaryNickName

这太可怕了,性能方面:)

选项 2a

添加一个接收字符串版本的文本列id。也许添加一些触发器来自动填充它。

选项 2b

id将列的类型更改为CHARVARCHAR(我认为CHAR应该首选主键)。

在两个 2a 中。和 2b。FULLTEXT在这种情况下,向该列添加一个索引(可能是一个)。

于 2013-01-23T09:01:00.823 回答
0

我认为 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 的全文搜索功能(可以提高搜索性能)。

Apache Lucene

MySQL全文搜索功能

这些工具旨在以更快的方式通过大字符串列表搜索特定模式或单词。许多网站使用它来构建自己的迷你搜索引擎。我发现mysql全文搜索功能几乎不需要学习曲线并且直接使用=D

于 2013-01-23T09:05:02.847 回答