簡體   English   中英

訂購 SQL 按結果數量查詢

[英]Order a SQL Query by number of results

我想做以下事情:

$searchParams 是一個數組,其中包含一些字符串(動態生成)。

現在聲明將是這樣的:

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

但我想要的是匹配最多的結果。 我可以在一個語句中編碼嗎? 所以它會像

ORDER BY MATCHES DESC

我怎么做?

SELECT COUNT(*) AS matches, manufacturer FROM shop_articles WHERE manufacturer LIKE '".$searchParams."%' GROUP BY(manufaturer) ORDER BY matches ASC

實際上,您必須測量制造商和 $searchParam 之間的匹配(相似度)。 不幸的是 LIKE 不提供這樣的功能。 您可以使用 Lavenshtein 距離。 看到這篇文章 - mysql/模糊搜索的 Levenshtein 距離的實現?

對於 searchParam 數組中的每個參數,您必須創建一個 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

SELECT 制造商,COUNT(manufacturer) FROM shop_articles WHERE Manufacturer LIKE '".$searchParams."' GROUP BY Manufacturer ORDER BY COUNT(manufacturer) DESC

不,您不能將數組提交給 LIKE 運算符。 比這更乏味。 :-)

如果您的數據尚未正確規范化,因此您在 PRODUCTS 表中有制造商名稱的變體(例如“HP”、“Hewlett Packard”)而不是 integer 制造商 ID,您必須通過減少那些繁重的工作來 go單個實體的變體。

完成這項工作(非常不可避免)的一種典型方法是創建一個制造商表,如下所示:

  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

primarymanufacturid = Manufacturerid 的行是主要實體。

然后,您可以在尚未將制造商 ID 添加到 PRODUCTS 表但它仍然具有名稱的臨時清理階段執行此操作:

                 select * from products 
                 where manufacturer in
                 (
                   select manufacturername from manufacturer
                   where primarymanufacturerid = 
                    (
                     select primarymanufacturerid from manufacturer
                     where manufacturername = 'Hewlett Packard'
                     )
                 )

PS 使用支持函數和存儲過程的數據庫引擎,您可以編寫自己的 function 接受分隔的名稱變體字符串,構建動態 SQL 語句,可能使用臨時表來存儲變體名稱每行一個名稱,並返回匹配的計數。 這將是一種資源密集型方法,僅推薦用於協助清理階段——而不是我投入生產供最終用戶作為日常面包消費的東西。

PPS 當然,一旦您正確創建了 MANUFACTURER 表,並完成了 primarymanufacturerid 引用,您可以將 [manufacturerid] 列添加到 PRODUCTS 表並相應地更新它,然后省去所有這些迂回的東西。

$sql = '選擇制造商 FROM shop_articles WHERE 1=1'; 對於($i=0;$i

通過這個你可以動態運行 $searchParams 數組的查詢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM