MySQL根据匹配的百分比或限制检索结果

时间:2014-10-13 18:51:00

标签: mysql limit percentage

我正在开展一个人们可以搜索维度的项目。

我们有以下表结构:

产品表: 宽度 长度 高度

人们可以通过提供以下维度来搜索此数据库:

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.

如何解决百分比部分和最大限度部分的问题如何能够帮我解决方法。

亲切的问候,

欧文

4 个答案:

答案 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个结果时,你需要更高的百分比。您还应该通过

确定哪个维度在您的订单中更重要