根据计算获取MySQL结果集+ LIMIT

时间:2018-08-31 01:04:23

标签: mysql sql

好,所以我想根据它们之间的相似程度从表中返回数据。 因此,如果所有栏位都是100%的完全比对,如果9/10的比对是90%,依此类推...

我可以做

SELECT * FROM table

,然后在php中使用for循环,或将某行置于更高的索引(如果其匹配百分比更高)的问题,但是问题在于如果没有10条记录但有100,000条记录呢!这将使脚本的加载永远需要...

因此LIMIT将无法处理100,000条记录,而又无法以某种方式弄清楚我无法弄清楚的SQL查询中的匹配百分比 它会涉及功能COUNT,SUM ...吗?

示例表: (用户喜欢的东西)

+---------------------------------------------------------------<br>
| id | color | food | cocktail | city | sport | <br>
+----------------------------------------------------------------<br>
| 1 | blue | pasta | cosmo | paris | football | <br>
| 2 | blue | burgers | lit | nyc | football | <br>
| 3 | green | hot dogs | negroni | nyc | football | <br>
| 4 | orange | sushi | manhattan | madrid | football | <br>
| 5 | purple | burgers | cosmo | paris | baseball | <br>
| 6 | red | sushi | lit | miami | basketball | <br>
| 7 | blue | sushi | cosmo | paris | football | <br>
| 8 | green | pasta | cosmo | madrid | baseball | <br>
| 9 | yellow | pasta | lit | paris | football |<br>
|10 | green | sushi | appletini | nyc | baseball |<br>
+------------------------------------------------------------------ <br>

这么小的表在选择所有记录并使用PHP排序时不会有什么不同,但请想象它是否是很多
所以说您比较WHERE id = 1并希望结果集为LIMIT 5,其中返回的5与第一行的匹配项最接近(在5个中)?
因此,用户使用蓝色|面食|宇宙|巴黎|足球|会有100%匹配
如果SQL无法做到这一点,那么我应该处理大量记录,因为用于循环排序记录的PHP在性能上会非常昂贵...

*很抱歉,如果这个问题令人困惑或写得不好,我会尽力解释!

1 个答案:

答案 0 :(得分:3)

在MySQL中,您可以执行以下操作:

select ft.*
from favorite_things ft cross join
     favorite_things ft1
where ft1.id = 1 and ft1.id <> ft.id
order by ( (ft.color = ft1.color) +
           (ft.food = ft1.food) +
           (ft.cocktail = ft1.cocktail) +
           (ft.city = ft1.city) +
           (ft.sport = ft1.sport)
         ) desc
limit 5;

MySQL在数字上下文中将布尔值视为数字,其中1表示“ true”,0表示“ false”。因此,将布尔值相加即可计算出匹配项。

其余只是order bylimit

在其他数据库中,您可以使用case表达式执行相同的操作。