按结果数量排序SQL查询

时间:2011-07-05 10:29:58

标签: php mysql sql

我想做以下事情:

$ searchParams是一个数组,包含一些字符串(动态生成)。

现在声明将是这样的:

SELECT manufacturer FROM shop_articles WHERE manufacturer LIKE '".$searchParams."%'

但我想要的是最匹配的结果。我可以在一个声明中编写代码吗? 所以它会像

ORDER BY MATCHES DESC

我该怎么做?

6 个答案:

答案 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数组的查询