我正在开展一个人们可以搜索维度的项目。
我们有以下表结构:
产品表: 宽度 长度 高度
人们可以通过提供以下维度来搜索此数据库:
300x200x250
我们想要的是我们根据最佳匹配对此结果进行排序。我们在数据库中找到具有100%匹配的确切尺寸。所以我们不仅希望找到100%匹配的结果,例如310x200x250或300x220x260也没问题,但匹配百分比会更低。
我们希望允许所有结果匹配90%或更多,或者说限制为50个结果。
基本查询当然是简单的:
SELECT * FROM products WHERE length >= 300 AND height >= 200 AND height >= 100 AND(FORMULE TO CALCULATE THE MATCH WHERE HIGHER THEN 90% OR MAX OF 50 RESULTS.
如何解决百分比部分和最大限度部分的问题如何能够帮我解决方法。
亲切的问候,
欧文
答案 0 :(得分:1)
您可以尝试这样的事情
SELECT *,
CEIL((300/ width * 0.333 +
200/ length * 0.333 +
250 / height * 0.333) * 100) pcnt
FROM products
WHERE width >= 300
AND length >= 200
AND height >= 250
HAVING pcnt > 90
ORDER BY pcnt DESC
LIMIT 50
输出:
| ID | WIDTH | LENGTH | HEIGHT | PCNT | |----|-------|--------|--------|------| | 1 | 300 | 200 | 250 | 100 | | 2 | 310 | 200 | 250 | 99 | | 3 | 300 | 220 | 260 | 96 |
这是 SQLFiddle 演示
答案 1 :(得分:0)
这是简单的版本: 我假设您使用传递的变量创建此查询? 让我们称这些$ length,$ width,$ height。 假设您的列被定义为INT或其他数字,您可以不加引号进行比较。
您想使用<>或'BETWEEN'比较
"SELECT * FROM products
WHERE (length>($length - 10) AND length<($length+10)
AND (height>($height- 10) AND length<($height+10)
AND (width>($width- 10) AND width<($height+10)";
其中10是你的范围。 如果$ length = 100 转换为“长度&gt;(100-10)”等。
您也可以使用BETWEEN
(length BETWEEN $length - 10 AND $length + 10)
BETWEEN需要较小的值,较高的第二个值
您还可以创建百分比:
length BETWEEN $length-($length*.1) AND $length+($length*.1)
然后
ORDER BY (height=$height AND width=$width AND length=$length) DESC, height*width*length
这会将具有精确尺寸的产品放在列表的顶部,然后是其他产品,产品尺寸越接近所需,它们就越好。
答案 2 :(得分:0)
你需要这样的东西来使这个查询起作用:
SELECT *
FROM (
SELECT whatever,
whatever,
MATCH_METRIC(length, 300, width, 200, height, 100) AS match
FROM products
WHERE length >= 300
AND width >= 200
AND height >= 100
) AS a
WHERE match >= 0.9
ORDER BY match DESC
LIMIT 50
这假设您有一个匹配度量公式,其中完美匹配产生的值为1.0,部分或接近匹配产生较小的值。
当然,你需要制定出MATCH_METRIC()
公式;你没有解释它是如何运作的。
我们假设如果您匹配一个维度,则需要使用两个值相隔多远的小数度量。
1.0 - (ABS(A-B)/A)
如果你把300和300放入这个公式,你就会得到1.0,这是一个完美的匹配。如果你输入300和330,你将获得0.9,这意味着10%的差异。然后,假设您要在所有三个维度上使用该公式,并选择具有最差匹配的维度 - 三个维度的最小匹配度量。然后你会得到你的MATCH_METRIC。
LEAST(1.0-(ABS(length-300)/length),
1.0-(ABS(width-200)/width),
1.0-(ABS(height-100)/height)
)
表示MATCH_METRIC()
函数。还有很多其他方法可以计算指标。你必须弄清楚哪一个最适合你的应用。
以下是计算MATCH_METRIC()
的存储过程的定义。
DELIMITER $$
DROP FUNCTION IF EXISTS MATCH_METRIC$$
CREATE FUNCTION MATCH_METRIC(
len FLOAT, targetlen FLOAT,
wid FLOAT, targetwid FLOAT,
hgt FLOAT, targethgt FLOAT
) RETURNS FLOAT
NO SQL DETERMINISTIC
COMMENT 'computes match between dimension and target dimension'
BEGIN
RETURN LEAST(1.0-(ABS(len-targetlen)/len),
1.0-(ABS(wid-targetwid)/wid),
1.0-(ABS(hgt-targethgt)/hgt)
);
END$$
DELIMITER ;
答案 3 :(得分:0)
您可以尝试以下代码
SELECT * FROM products,
(ABS(width-300)/300)-1 as percwidth,
(ABS(length-200)/200)-1 as perclength,
(ABS(length-200)/200)-1 as percheigth
WHERE percwidth >=0.9
AND
perclength >=0.9
AND
percheigth >=0.9
ORDER BY percwidth,perclength,percheigth DESC
LIMIT 50
我认为当你无法返回超过90%的50个结果时,你需要更高的百分比。您还应该通过
确定哪个维度在您的订单中更重要