【问题标题】:mysql Query to find the record with best matching row with given valuemysql查询以找到具有给定值的最佳匹配行的记录
【发布时间】:2014-10-23 06:40:49
【问题描述】:

查询与给定值匹配的行最匹配的记录

我有一张有价值的桌子

如果不存在则创建表 product ( id int(11) NOT NULL AUTO_INCREMENT, product varchar(255) 非空, value1 float NOT NULL, value2 float NOT NULL, value3 float NOT NULL, 主键 (id) ) ENGINE=MyISAM 默认字符集=latin1 AUTO_INCREMENT=7 ;

插入productidproductvalue1value2value3)值 (1, '测试', 5.3, 6.8, 9), (2, '测试', 8, 9, 12), (3, '测试', 12, 15, 20), (4, 'test1', 6, 8, 10), (5, 'test1', 8, 12, 18), (6, 'test1', 12, 17, 21);

例子

标识 |产品 |值1 |值2 |价值3 | 1 |测试 | 5.3 | 6.8 | 9 | 2 |测试 | 8 | 9 | 12 | 3 |测试 | 12 | 15 | 20 | 4 |测试1 | 6 | 8 | 10 | 5 |测试1 | 8 | 12 | 18 | 6 |测试1 | 12 | 17 | 21 |

在此,有两种类型的产品示例 test 和 test1 并具有一些值。 我需要通过给出 value1、value2 和 value3 来获得 test 和 test1 的最佳匹配产品|

ex value1=6 value=7 value3=8

在这种情况下,我需要得到

标识 |产品 |值1 |值2 |价值3 | 1 |测试 | 5.3 | 6.8 | 9 | 4 |测试1 | 6 | 8 | 10 |

请帮我写一个mysql查询。

【问题讨论】:

  • 定义“最匹配”

标签: php mysql sql sqlite


【解决方案1】:

我建议以下解决方案:

选择 id、产品、value1、value2、value3 从 (选择 id、product、value1、value2、value3、abs((value1 + value2 + value3) - (6+7+8)) 作为 t_min 中的最小值,按 id、product 分组)t
按产品分组;

6+7+8 - 是value1+value2+value3

它包含子选择,但分别返回最匹配的结果 test 和 test1 以及您在 products 列中可能拥有的其他不同值。

【讨论】:

    【解决方案2】:

    假设您的值是某种数字类型,您可以尝试执行某种类似于以下的查询:

    SELECT *,
      (abs(value1 - targetValue1) +
       abs(value2 - targetValue2) +
       abs(value3 - targetValue3)) AS difference
    FROM products
    ORDER BY
       difference
    

    targetValue1-3 是您正在寻找的产品价值。如果您只想要差异低于某种阈值的记录,那么您可以添加WHERE difference < threshold

    【讨论】:

    • 在这种情况下,我需要 test 和 test1。需要产品的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多