首页 文章

mysql查询以查找具有给定值的最佳匹配行的记录

提问于
浏览
-2

查询以找到具有给定值的最匹配行的记录

我有一张有一些 Value 的 table

CREATE TABLE IF NOT EXISTS product (
  id int(11) NOT NULL AUTO_INCREMENT,
  product varchar(255) NOT NULL,
  value1 float NOT NULL,
  value2 float NOT NULL,
  value3 float NOT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

 INSERT INTO product (id, product, value1, value2, value3) VALUES
(1, 'test', 5.3, 6.8, 9),
(2, 'test', 8, 9, 12),
(3, 'test', 12, 15, 20),
(4, 'test1', 6, 8, 10),
(5, 'test1', 8, 12, 18),
(6, 'test1', 12, 17, 21);

id | product | value1 | value2 | value3 |
1 | test    | 5.3    | 6.8    | 9      |
2 | test    | 8       | 9     | 12     |
3 | test    | 12     | 15     | 20     |
4 | test1  | 6       | 8      | 10     |
5 | test1  | 8       | 12     | 18     |
6 | test1  | 12      | 17     | 21     |

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

ex value1 = 6 value = 7 value3 = 8

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

id | product | value1 | value2 | value3 |
1  | test    | 5.3    | 6.8    | 9      |
4  | test1   | 6      | 8      | 10     |

请帮我写一个mysql查询 .

2 回答

  • 0

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

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

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

  • 0

    我建议以下解决方案:

    选择id,product,value1,value2,value3 from(select id,product,value1,value2,value3,abs((value1 value2 value3) - (6 7 8))作为最小值从t_min group by id,product)t
    按产品分组;

    6 7 8 - 是value1 value2 value3

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

相关问题