[英]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.