我想做以下事情:
$ searchParams是一个数组,包含一些字符串(动态生成)。
现在声明将是这样的:
SELECT manufacturer FROM shop_articles WHERE manufacturer LIKE '".$searchParams."%'
但我想要的是最匹配的结果。我可以在一个声明中编写代码吗? 所以它会像
ORDER BY MATCHES DESC
我该怎么做?
答案 0 :(得分:2)
SELECT COUNT(*) AS matches, manufacturer FROM shop_articles WHERE manufacturer LIKE '".$searchParams."%' GROUP BY(manufaturer) ORDER BY matches ASC
答案 1 :(得分:1)
实际上你必须测量制造商和$ searchParam之间的匹配(相似性)。不幸的是,LIKE没有提供这样的功能。 你可以使用Lavenshtein距离。请参阅此帖子 - Implementation of Levenshtein distance for mysql/fuzzy search?
答案 2 :(得分:1)
对于searchParam数组中的每个param,你必须制作一个like子句
SELECT Manufacturer, COUNT(*) AS Matches FROM
FROM shop_articles WHERE (
manufacturer LIKE '".$searchParams[0]."%' OR
manufacturer LIKE '".$searchParams[1]."%' OR
...
manufacturer LIKE '".$searchParams[n]."%' OR )
GROUP BY Manufacturer
ORDER BY Matches
答案 3 :(得分:0)
SELECT制造商,COUNT(制造商)FROM shop_articles WHERE制造商LIKE'“。$ searchParams。”'GROUP BY制造商ORDER BY COUNT(制造商)DESC
答案 4 :(得分:0)
不,您无法向LIKE运算符提交数组。这比那更乏味。 : - )
如果您的数据尚未正确规范化,那么您在PRODUCTS表中有制造商名称的变体(例如“HP”,“Hewlett Packard”)而不是整数ManufacturerID,那么您必须经历繁琐的工作将这些变体减少到单个实体。
这样做(非常不可避免)工作的典型方法是创建一个像这样的制造商表:
Table: MANUFACTURER
manufacturerid INTEGER primary key
manufacturername varchar
primarymanufacturerid INTEGER FOREIGN KEY REFERENCES MANUFACTURER(manufacturerid)
最后一列允许您将变体名称(例如“HP”)与存储主制造商记录的行(例如“Hewlett Packard”)相关联。
124, Hewlett Packard, 124
367, HP, 124
primarymanufacturerid = manufacturerrid是主要实体的行。
然后,您可以在临时清理阶段执行此操作,此时尚未将productsrid添加到PRODUCTS表但仍具有名称:
select * from products
where manufacturer in
(
select manufacturername from manufacturer
where primarymanufacturerid =
(
select primarymanufacturerid from manufacturer
where manufacturername = 'Hewlett Packard'
)
)
P.S。使用支持函数和存储过程的数据库引擎,您可以编写自己的函数,接受分隔的名称变体字符串,构建动态SQL语句,可能使用临时表来存储变量名称每行一个名称,以及返回了一系列的比赛。这将是一种资源密集型方法,建议仅用于协助清理阶段 - 而不是我为生产最终用户生产的日常面包消费。
P.P.S。当然,一旦您正确创建了MANUFACTURER表,并且已完成primarymanufacturerid引用,您可以在PRODUCTS表中添加[manufacturerid]列并相应地更新它,然后省去所有这些环形的东西。
答案 5 :(得分:0)
$ sql ='SELECT manufacturer FROM shop_articles WHERE 1 = 1'; 为($ I = 0; $我
通过这个你可以动态地运行$ searchParams数组的查询