当前位置: 首页 > 面试题库 >

提前查询。在mysql中对最相关的字段进行排名

司寇琨
2023-03-14
问题内容

假设我们有一个这样的数据库:

Project_tbl:

-----------------
id | Project_name
-----------------
1  | A 
2  | B
3  | C
-----------------

personel_project_tbl:

--------------------
user_id | Project_id
--------------------
1       | 1
2       | 2
3       | 1
3       | 2
2       | 3
--------------------

instrument_project_tbl:

--------------------------
instrument_id | Project_id
--------------------------
1             | 1
1             | 2
2             | 2
2             | 1
1             | 3
--------------------------

现在,我需要对项目列表进行排序,并根据它们与项目A的相似性对其进行排名。

例如:

A和B在3个用户中共有1个用户,在2个工具中有2个用户,因此它们的相似度排名是(1/2 + 2/2)/ 2 = 75%

A和C没有共同的用户,但拥有2台以上的仪器中的1台,因此(1/2)/ 2 = 25%

所以B比be更相似,输出应该是

--------------
项目| 秩
--------------
2 | 75
3 | 25

这是我想到的第一个解决方案…
如果我是在PHP和MySQL中完成的,那将是这样的:

 for all tables as table_x
    for all projects (except A) as prj_y
         unique = (Select distinct count(items) from table_x where project is A)
         count += (Select distinct count(items) from table_x
                   where project is prj_x and items are in
                     (select distinct items from table_x where project is a)
                  )/unique

因此,复杂度将为O( n 2),并且使用索引编制索引时,选择也将花费O(log n ),而这是无法承受的。

您是否有想法完全在MySQL中完成或以更好,更快的方式进行?

*更多信息和注释:*

  1. 我仅限于PHP和MySQL。

  2. 这只是一个例子,在我的实际项目中,表有20多个表,因此该解决方案应该具有 性能

  3. 这个问题是对这个问题的补充问题:如果yr解决方案可以同时或以某种方式应用于两者(在某种程度上),那么可以在MySQL数据库中获得重复最多的相似字段(这将是巨大的)。我想将相关项目的价值乘以项目的相似性以获得最佳选择…

总之,这两个问题将是:获得最相关的项目,获得所有项目的相似项目,并为当前项目找到最相似的项目,其中该项目也与当前项目相似!哟

感谢您的智力回答,如果您能对情况有所了解,我们将不胜感激


问题答案:

你可以做这样:

SET @Aid = (SELECT id
            FROM Project_tbl
            WHERE Project_name = 'A');

SELECT P.id
  , (IFNULL(personel.prop, 0) +
     IFNULL(instrument.prop, 0)
    )/2*100 Rank
  , personel.prop AS personell
  , instrument.prop AS instrument
FROM Project_tbl P
LEFT JOIN
  ( SELECT B.Project_id pid, COUNT(*)/C.ref prop
    FROM personel_project_tbl A,
         personel_project_tbl B,
         (SELECT COUNT(*) AS ref
          FROM personel_project_tbl
          WHERE Project_id = @Aid
         ) AS C
    WHERE A.user_id = B.user_id
    AND A.Project_id = @Aid
    GROUP BY B.Project_id
  ) personel ON P.id = personel.pid
LEFT JOIN
  ( SELECT B.Project_id pid, COUNT(*)/C.ref prop
    FROM instrument_project_tbl A,
        instrument_project_tbl B,
         (SELECT COUNT(*) AS ref
          FROM instrument_project_tbl
          WHERE Project_id = @Aid
         ) AS C
    WHERE A.instrument_id = B.instrument_id
    AND A.Project_id = @Aid
    GROUP BY B.Project_id
  ) instrument ON P.id = instrument.pid
WHERE P.id <> @Aid
ORDER BY Rank DESC

想法是每个表都有一个子查询,并且这些子查询中的每一个将项目ID映射到给定表的对应率。

我什么都没说关于性能。您将不得不尝试看看它是否足够快地满足您的需求,但是正如我所看到的那样,由于必须检查所有数据,因此无法克服您提到的O( n
2)复杂性。



 类似资料:
  • 我在mongodb中收集了一些代表过去和未来事件的文档。文档中有两个日期字段“开始”和“结束”,它们是bson ISODATE对象。我正在做一个查找查询,它获取了不超过3天前结束的所有事件。 如何根据事件的今天和结束日期之间的时间(和日期)对该查询的响应进行排序。换句话说,2天前结束的事件应该发生在大约与2天后发生的事件相同的位置。这很重要,因为我不想首先显示所有已经发生的事件,也不想首先显示未来

  • 问题内容: 正在搜寻 这不起作用....我到处搜索并阅读了文档。但是我只是看不到如何根据他们的“所有者”关系名称对我的(基础)查询进行排序。 它总是导致: 这一定很容易…但是我看不到。还研究了比较器,这似乎合乎逻辑,但是我看不到ORDER BY的查询部分在哪里生成或我应该返回什么,因为所有内容都是动态生成的。为每个“玩家”关系做一个比较器来做一件简单的事情似乎过于复杂。 问题答案: SQLAlch

  • 本文向大家介绍MySQL查询以字符串字段中的数字字符对行进行分组?,包括了MySQL查询以字符串字段中的数字字符对行进行分组?的使用技巧和注意事项,需要的朋友参考一下 为此,您可以在+运算符的帮助下将0与字符串字段连接起来。这里的场景就像我们需要从字符串字段“ 9844Bob ”中获取数字“ 9844 ”。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所

  • 问题内容: 我有一个类型字段。即使它是type ,它也存储带有可选前导零的整数值。排序按字典顺序排序(在之前)。如何订购的数值(来之前)? 当前,我使用查询: 问题答案: 有几种方法可以做到这一点: 将它们存储为数值而不是字符串。您已经打折了,因为您希望保持字符串像完整的前导零。 按字符串顺序转换为数字。这将起作用,但请注意,这对于大型数据库而言是性能的杀手er。每行函数的扩展性不是很好。 添加第

  • 问题内容: 所以我有一个字段以以下格式存储值:,例如23 / 2014、24 / 2014、12 / 2015等。 因此,如果将此字段映射为一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 / 2014等),则可以正常工作,例如。 因此,使用11 /或/ 2014之类的其他内容进行搜索不会返回匹配。这可以。 但是,如果将字段定义为,则无法使用查询进

  • Hibernate5.2.10 查询DSL(jpa,apt)4.1.4 Spring Boot 1.5.6 Spring Data JPA(因此,使用存储库) 存储库扩展 选择以下meetupCampaign.id=x *meetupCampaign.ApprovalStatus=y的关联会议: *meetupCampaign.id=x *meetupCampaign.ApprovalStatus