如何在 mysql 中匹配两个 table
How to match two table in mysql
我想请问有没有"pratical"的解决方案可以匹配两个table...
例如,我有两个 table,供应和需求具有相同的列。
对于供应中的每一行 table,我想知道有多少需求与这些匹配,反之亦然。
编辑
示例table 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 列匹配
迈克尔 3 列中的第 1 列
Kimi 第 1 列,共 3 列
塞巴斯蒂安第 0 列,共 3 列
刘易斯第 1 列,共 3 列
如果可能,我还需要匹配的列数,因为我必须考虑只匹配超过 50%
现在我在级联上使用 AND/OR 并且使用 15/20 变量它不是顶部。
谢谢
我将尝试回答,但这是一个非常广泛的问题,尤其是如果您想考虑性能(如果两个 table 都很大,您将需要完全不同的解决方案)。
假设两个 table 的行数都很少,至少有两种方法,您是更频繁地查询,还是更频繁地查询 insert/update supply/demands .
假设 supply/demand 不经常更改,但您查询了很多次。一种方法是创建一个包含 3 个字段的 table,(例如 supply_demand_match
):(supply_id
,demand_id
)作为 PK 和 score
.根据您的示例,分数将为 0、1、2 或 3,或者百分比(共同字段数)。这样你就可以方便快捷的查询这个table。例如,要查找客户对笔记本 ID 95 感兴趣的内容:select demand_id from supply_demand_match where supply_id = 95 and score > 1
(或 2,或 50%,或您决定得分的任何值)。
现在如何填写table?每次 insert/update 新供应或新需求时,您都需要 insert/update 所有相应的行。您可以使用您正在使用的任何脚本语言或纯 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 处理以计算每个可能的分数。这可能需要一段时间!
现在,如果您 insert/update 查询结果的频率比查询结果的频率高,则不需要将结果存储在 table 中,那样会适得其反。您可以将上述 SELECT
查询与 HAVING
子句结合使用,例如 HAVING score >= 2
我想请问有没有"pratical"的解决方案可以匹配两个table...
例如,我有两个 table,供应和需求具有相同的列。 对于供应中的每一行 table,我想知道有多少需求与这些匹配,反之亦然。
编辑
示例table 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 列匹配
迈克尔 3 列中的第 1 列
Kimi 第 1 列,共 3 列
塞巴斯蒂安第 0 列,共 3 列
刘易斯第 1 列,共 3 列
如果可能,我还需要匹配的列数,因为我必须考虑只匹配超过 50%
现在我在级联上使用 AND/OR 并且使用 15/20 变量它不是顶部。
谢谢
我将尝试回答,但这是一个非常广泛的问题,尤其是如果您想考虑性能(如果两个 table 都很大,您将需要完全不同的解决方案)。
假设两个 table 的行数都很少,至少有两种方法,您是更频繁地查询,还是更频繁地查询 insert/update supply/demands .
假设 supply/demand 不经常更改,但您查询了很多次。一种方法是创建一个包含 3 个字段的 table,(例如 supply_demand_match
):(supply_id
,demand_id
)作为 PK 和 score
.根据您的示例,分数将为 0、1、2 或 3,或者百分比(共同字段数)。这样你就可以方便快捷的查询这个table。例如,要查找客户对笔记本 ID 95 感兴趣的内容:select demand_id from supply_demand_match where supply_id = 95 and score > 1
(或 2,或 50%,或您决定得分的任何值)。
现在如何填写table?每次 insert/update 新供应或新需求时,您都需要 insert/update 所有相应的行。您可以使用您正在使用的任何脚本语言或纯 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 处理以计算每个可能的分数。这可能需要一段时间!
现在,如果您 insert/update 查询结果的频率比查询结果的频率高,则不需要将结果存储在 table 中,那样会适得其反。您可以将上述 SELECT
查询与 HAVING
子句结合使用,例如 HAVING score >= 2