mysql - mysql中如何匹配两个表

标签 mysql matching

我想问是否有一个“实用”的解决方案来匹配两个表...

例如,我有两个表,供应和需求,具有相同的列。 对于供应表中的每一行,我想知道有多少需求与这些行匹配,反之亦然。

编辑

示例表 sypply

id  Manufacturer    Cpu     Ram    Hdd
95  acer            i3      4gb    500gb
96  acer            i5      4gb    1tb
97  hp              i3      8g     500gb
98  sony            i7      4gb    500gb
99  samsung         i3      8g     750gb

以及餐 table 需求

id  customer    Cpu     Ram     Hdd
61  John        i3      8gb     500gb
62  Michael     x6      4gb     ssd
63  Kimi        i3      16gb    1tb
64  Sebastian   x4      16gb    1tb
65  Lewis       i5      16gb    500gb

我想知道对 ID 95 的笔记本感兴趣的客户

John 有 3 列中的 2 列匹配

Michael 第 1 栏(共 3 栏)

Kimi 第 1 列(共 3 列)

塞巴斯蒂安第 0 列,共 3 列

刘易斯第 1 列(共 3 列)

如果可能,我还需要匹配的列数,因为我必须考虑仅匹配超过 50%

现在我在级联上使用 AND/OR,并且对于 15/20 变量,它不是顶部。

谢谢

最佳答案

我将尝试回答,但这是一个非常广泛的问题,特别是如果您想考虑性能(如果两个表都很大,则需要完全不同的解决方案)。

假设两个表的行数都很少,那么至少有两种方法,无论您是更频繁地查询,还是更频繁地插入/更新供应/需求。

假设供给/需求不经常变化,但您查询了很多次。一种方法是创建一个表(例如 supply_demand_match),其中包含 3 个字段:(supply_iddemand_id)作为 PK 和得分。根据您的示例,分数将为 0、1、2 或 3,或百分比(公共(public)字段数)。这样你就可以方便快捷地查询这个表。例如,要查找客户对 ID 95 的笔记本感兴趣的内容:select Demand_id from Supply_demand_match where Supply_id = 95 and Score > 1(或 2、或 50%,或您决定获取分数的任何值) .

现在如何填写这个表?每次插入/更新新的供应或新的需求时,您都需要插入/更新所有相应的行。您可以使用您使用的任何脚本语言或纯 SQL 中的脚本来完成此操作(如果您愿意,可以使用触发器)。例如,这样的事情应该有效:

INSERT INTO supply_demand_match (supply_id, demand_id, score) (
   SELECT supply.id, demand.id,
   IF(supply.Cpu = demand.Cpu, 1, 0) + IF (supply.Ram = demand.Ram,1,0) + ... as score
   FROM supply
   JOIN demand
   WHERE ...
)

请注意,连接没有连接条件,因此MySQL将处理每个行组合以计算每个可能的分数。这可能需要相当长的时间!

现在,如果您插入/更新的次数多于查询结果的次数,则不需要将结果存储在表中,否则会适得其反。您可以将上述 SELECT 查询与 HAVING 子句结合起来,例如 HAVING Score >= 2

关于mysql - mysql中如何匹配两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32084748/

相关文章:

python - 谁能帮我找出这段代码有什么问题吗?相同RNA序列匹配程序

mysql - 用户输入和数据库包含 '%' 并使用 LIKE '%xx%' 在数据库中搜索输入

php - 如何优化这个 PHP 脚本/删除 HTML

PHP第一个while循环的输出结果作为第二个while循环的查询变量

opencv - 为什么 sgbm 中的视差值可以被 16 整除?

algorithm - 匹配两个文档之间的差异

php - mysqli_real_escape_string 与 filter_input()?我应该使用什么方法?

mysql - 为什么登录名通常只能包含拉丁符号和数字?

c# - 我可以在 C# 中将正则表达式与 String.Replace 一起使用吗?

algorithm - 根据偏好的相似性将两个元素(人)匹配在一起