好,所以我想根据它们之间的相似程度从表中返回数据。 因此,如果所有栏位都是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在性能上会非常昂贵...
*很抱歉,如果这个问题令人困惑或写得不好,我会尽力解释!
答案 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 by
和limit
。
在其他数据库中,您可以使用case
表达式执行相同的操作。