我们希望使用单个搜索框根据采购订单ID(主键)或采购订单名称过滤采购订单。
我们使用like参数搜索名称字段,但它似乎不适用于主键。它仅在我们对id(s)使用相等运算符时才有效。但是,如果我们可以使用像id一样过滤采购订单,那将是更好的选择。怎么做?
create table purchase_orders (
id int(11) primary key,
name varchar(255),
...
)
答案 0 :(得分:0)
SELECT *
FROM purchase_orders
WHERE id LIKE '%123%'; -- tribute to TemporaryNickName
这很糟糕,表现明智:)
添加一个文本列,其中包含字符串版本id
。也许添加一些触发器来自动填充它。
将id
列的类型更改为CHAR
或VARCHAR
(我认为主键应首选CHAR
。)
在两个2a中。和2b。例如,在此列中添加一个索引(可能是一个FULLTEXT
)。
答案 1 :(得分:0)
我认为LIKE应该有用。我假设您的SQL没有正确编写。 假设您有订单名称“ABCDEF”,那么您可以使用以下查询结构找到它。
SELECT id FROM purchase_orders WHERE name LIKE '%CD%';
为了解释它,%符号表示它是通配符。因此,此查询将选择其中包含“CD”的任何String。
根据表结构,varchar可以包含255个字符。我认为这是一个非常大的字符串,它可能会占用大量资源,并且需要花费更多时间来使用 LIKE 等SQL函数进行搜索。您始终可以按ID
进行搜索
WHERE id = something
。这比btw快得多。
,但我认为订单ID不是用户友好的数据,而是让用户使用产品名称。我的建议是使用apache Lucene或MySQL的全文搜索功能(可以提高搜索性能)。
MySQL Full text search function
这些工具是为了以更快的方式搜索大字符串列表中的某些模式或单词而构建的工具。许多网站使用它来构建自己的迷你搜索引擎。我发现mysql全文搜索功能几乎没有学习曲线而且直接使用= D