MySQL / PHP – 需要能够生成具有比其他列更重的某些列的查询结果

我的任务是创建一个搜索功能,搜索时,某些字段比其他字段更重要.

这是一个简化的例子.

汽车(表)
年,品牌,型号,颜色,类型(列)

假设有人搜索以下内容

年份:1968年
制作:福特
型号:野马
红色
类型:跑车

如果表中的汽车没有正确的字段,则它们不应显示,但如果记录有一些正确的字段但不是全部它们仍应显示.但是某些字段的权重应该高于其他字段.

例如,他们可能像这样加权:
柱 – 重量
年 – 30
制作 – 100
型号 – 85
颜色 – 10
类型 – 50

因此,如果记录与“make”字段和“model”字段中的搜索匹配,则该记录将位于“year”,“color”和“type”字段中匹配的记录之上,因为我们放置了权重在每一栏上.

因此,假设查询匹配数据库中两条记录的至少一个字段,它们应根据权重按最相关的顺序排序:

1971年,福特,Fairlane,Blue,跑车(重量= 185)
1968年,道奇,充电器,红色,跑车(重量= 90)

我一直绞尽脑汁试图找出如何使这项工作.如果有人做过这样的事情,请告诉我如何让它发挥作用.

我想通过连接尽可能多地在MySQL中完成工作,我认为这将比在PHP中完成大部分工作更快地提高结果.但是,对此问题的任何解决方案都将非常感激.

提前致谢

解决方法:

忍受我,这将是一个奇怪的查询,但它似乎在我的最终工作.

SELECT SUM(
  IF(year = "1968", 30, 0) +
  IF(make = "Ford", 100, 0) +
  IF(model = "Mustang", 85, 0) +
  IF(color = "Red", 10, 0) +
  IF(type = "Sports Car", 50, 0)
) AS `weight`, cars.* FROM cars 
  WHERE year = "1968" 
  OR make = "Ford"
  OR model = "Mustang"
  OR color = "Red"
  OR type = "Sports Car"
GROUP BY cars.id
ORDER BY `weight` DESC;

基本上,这会按所有结果对所有结果进行分组(这是SUM()函数所必需的,对不同字段进行一些计算并将权重作为总值返回,然后将其排序为最高 – 最低.此外,这只会返回结果,其中一列与提供的值匹配.

由于我没有您的数据库的完整副本,请在您的最后运行一些测试,并告诉我是否有任何需要调整的内容.

预期成绩:

+============================================================+
| weight | year | make      | model    | color  | type       |
|============================================================|
| 130    | 1968 | Ford      | Fairlane | Blue   | Roadster   |
| 100    | 2014 | Ford      | Taurus   | Silver | Sedan      |
| 60     | 2015 | Chevrolet | Corvette | Red    | Sports Car |
+============================================================+

因此,正如您所看到的,结果将列出最接近的匹配,在这种情况下是两辆福特(100)车辆,一辆来自1968(30),以及红色跑车(10 50)作为最接近的匹配(使用您的标准)

还有一件事,如果你还想显示剩下的结果(即结果为0的重量匹配分数),只需删除WHERE … OR …,这样它就会检查所有记录.干杯!

继续下面的注释,在数据透视表上左键连接后检查重量:

SELECT SUM(
  IF(cars.year = "1968", 30, 0) +
  IF(cars.make = "Ford", 100, 0) +
  IF(cars.model = "Mustang", 85, 0) +
  IF(cars.color = "Red", 10, 0) +
  IF(types.name = "Sports Car", 50, 0)
) AS `weight`, cars.*, types.* FROM cars 
LEFT JOIN cars_types ON cars_types.car_id = cars.id
LEFT JOIN types ON cars_types.type_id = types.id
  WHERE year = "1968" 
  OR cars.make = "Ford"
  OR cars.model = "Mustang"
  OR cars.color = "Red"
  OR types.name = "Sports Car"
GROUP BY cars.id
ORDER BY `weight` DESC;

这是实践中LEFT JOIN的图片

enter image description here

如你所见,Cobalt匹配颜色(银色)和模型(Cobalt)(85 10),而Calibre匹配类型(跑车)(50).是的,我知道道奇Caliber不是跑车,这是例如.希望有所帮助!

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...