我的任务是创建一个搜索功能,搜索时,某些字段比其他字段更重要.
这是一个简化的例子.
汽车(表)
年,品牌,型号,颜色,类型(列)
年份: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的图片:
如你所见,Cobalt匹配颜色(银色)和模型(Cobalt)(85 10),而Calibre匹配类型(跑车)(50).是的,我知道道奇Caliber不是跑车,这是例如.希望有所帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。