我们希望使用单个搜索框根据采购订单id (主键)或采购订单名称过滤采购订单。
我们使用like参数在name字段上进行搜索,但它似乎不能在主键上工作。只有当我们对id(s)使用等于运算符时,它才有效。但如果我们可以使用like for id过滤采购订单,那将是更可取的。该怎么做呢?
create table purchase_orders (
id int(11) primary key,
name varchar(255),
...
)发布于 2013-01-23 17:01:01
选项1
SELECT *
FROM purchase_orders
WHERE id LIKE '%123%'; -- tribute to TemporaryNickName这在性能方面是可怕的:)
方案2a
添加一个文本列,该列接收id的字符串版本。也许可以添加一些触发器来自动填充它。
方案2b
将id列的类型更改为CHAR或VARCHAR (我认为主键应首选CHAR )。
在两个2a中。和2b。案例,向该列添加一个索引(可能是FULLTEXT索引)。
发布于 2013-01-23 17:05:03
我觉得LIKE应该行得通。我假设您的SQL没有正确编写。假设您的订单名为"ABCDEF“,则可以使用以下查询结构找到它。
SELECT id FROM purchase_orders WHERE name LIKE '%CD%';为了解释它,% sign表示它是一个通配符。因此,此查询将选择其中包含"CD“的任何字符串。
根据表结构,varchar可以包含255个字符。我认为这是一个相当大的字符串,它可能会消耗大量的资源,并且需要更多的时间来使用像这样的这样的SQL函数来搜索一些东西。你总是可以通过id来搜索它
WHERE id = something.顺便说一下,这是更快的方法
,但我不认为订单id是用户友好的数据,相反,我会让用户使用产品名称。我的建议是使用apache Lucene或MySQL的全文搜索功能(这可以提高搜索性能)。
Apache lucene
MySQL Full text search function
这些工具是为了通过大字符串列表以更快的方式搜索特定的模式或单词而构建的。许多网站使用它来构建自己的迷你搜索引擎。我发现mysql全文搜索功能几乎不需要学习曲线,直接使用=D
https://stackoverflow.com/questions/14475639
复制相似问题