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

时间:2014-10-23 06:40:49

标签: php mysql sql sqlite

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

我有一张有一些价值的桌子

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 :(得分:0)

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

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

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

答案 1 :(得分:0)

我建议采用以下解决方案:

选择id,product,value1,value2,value3 从 (选择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列中可能具有的其他不同值。