2014-01-15 1 views
0

У меня есть две таблицы «Клиент» и «CustomerCommuncation», которые имеют поля:Mysql оптимизации запросов в хранимой функции

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



**CustomerCommunication** 
--------------------------------------------------------- 
|ID  | CommValue    | CustomerID  | 
| 1  | [email protected]   | 1    | 
| 2  | [email protected]   | 1    | 
| 3  | 9000000000    | 1    | 
| 4  | [email protected]  | 1    | 
| 5  | [email protected]   | 2    | 
| 6  | [email protected]   | 2    | 
| 8  | 9000000000    | 3    | 
| 9  | [email protected]  | 3    | 
| 10 | 9000000000    | 5    | 
| 11 | [email protected]   | 4    | 

Эти две таблицы могут быть обобщенно описаны как: Джон Менон уже можно связаться по: абв @ gmail.com, ABCD @ gmail.com, ABCDE @ gmail.com 9000000000.

Два клиента похожи, когда их Firstname, LastName и по крайней мере один из CommValue является similar.Clearly customerIDs 1,3 и 5 аналогично тому, как у них одинаковое имя FirstName, LastName и доля s a Номер телефона 9000000000.

Вопрос: Учитывая список клиентов в группе. мы должны найти объединение CustomerID, которые являются похожими на Клиентов, присутствующих в Группе.

Например, если задана группа (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 

}

Есть ли какой-либо другой оптимизированный способ сделать это?

ответ

0

Возможно, это может быть сведено к одному фрагменту SQL.

Я предположил, что вы хотите получить список идентификаторов похожи на каждое имя идентификатор (то есть, что 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 скрипку: -

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

+0

большое спасибо .just немного изменений вместо "a.Id = d.CustomerID" должно быть "b.Id = d.CustomerID" – satishsingh2230