gpt4 book ai didi

Mysql存储函数中的查询优化

转载 作者:行者123 更新时间:2023-11-30 00:49:05 25 4
gpt4 key购买 nike

我有两个表“Customer”和“CustomerCommuncation”,其中包含字段:

 **Customer**
---------------------------------------------
|ID | FirstName | LastName |
| 1 | John | Menon |
| 2 | george | cool |
| 3 | John | Menon |
| 4 | george | cool |
| 5 | John | Menon |



**CustomerCommunication**
---------------------------------------------------------
|ID | CommValue | CustomerID |
| 1 | abc@gmail.com | 1 |
| 2 | abcd@gmail.com | 1 |
| 3 | 9000000000 | 1 |
| 4 | abcde@gmail.com | 1 |
| 5 | xyz@gmail.com | 2 |
| 6 | xyzw@gmail.com | 2 |
| 8 | 9000000000 | 3 |
| 9 | abcdef@gmail.com | 3 |
| 10 | 9000000000 | 5 |
| 11 | xyz@gmail.com | 4 |

这两个表可以统称为: 约翰·梅农 (John Menon) 的联系方式为:abc@gmail.com、abcd@gmail.com、abcde@gmail.com 9000000000。

如果两个客户的名字、姓氏和至少一个 CommValue 是相似的 相似。显然,customerID 1,3 和 5 是相似的,因为它们具有相同的名字、姓氏 并共享电话号码 9000000000。

问题: 给定一个组中的 customerID 列表。我们必须找到 CustomerID 的并集,它们是 与集团中的客户类似。

例如,如果给定一个 Group(1,2),则结果将是 (3,4,5)

我编写了如下存储过程:

CREATE DEFINER= FUNCTION `stroredfunc`( custlist varchar(1000)) RETURNS varchar(10000) 
{
begin
declare v_commvalue varchar(10000) default '';
declare v_LastName varchar(1000) default '';
declare v_firstname varchar(1000) default '';
declare v_result varchar(10000) default '';

select group_concat(Distinct c.FirstName SEPARATOR ',') as v_firstname,
group_concat(Distinct c.LastName SEPARATOR ',') as v_LastName,
group_concat(Distinct cc.CommValue SEPARATOR ',') as v_commvalue
from Customer as c inner join CustomerCommunication as cc
on cc.CustomerID=c.ID where FIND_INSET(c.ID,custlist);


select group_concat(distinct cc.CustomerID) into v_result from Customer as c inner join
CustomerCommunication as cc
on cc.CustomerID=c.ID where FIND_IN_SET(c.FirstName,v_firstname) and
FIND_IN_SET(c.LastName,v_LastName) and
FIND_IN_SET(cc.CommunicationValue,v_commvalue )
;

return v_result;
end

}

还有其他优化方法吗

最佳答案

可能可以减少为一条 SQL。

我假设您想要一个与每个命名 id 相似的 id 列表(即 1 类似于 3 和 5,2 类似于 4):-

SELECT a.ID, a.FirstName, a.LastName, GROUP_CONCAT(DISTINCT b.Id)
FROM Customer a
INNER JOIN Customer b
ON a.FirstName = b.FirstName
AND a.LastName = b.LastName
AND a.Id != b.Id
INNER JOIN CustomerCommunication c
ON a.Id = c.CustomerID
INNER JOIN CustomerCommunication d
ON a.Id = d.CustomerID
AND c.CommValue = d.CommValue
WHERE a.Id IN (1,2)
GROUP BY a.ID, a.FirstName, a.LastName

在 SQL fiddle 上敲出的示例:-

http://www.sqlfiddle.com/#!2/cf054/1

关于Mysql存储函数中的查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21134835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com