[英]MYSQL query closest match from a second table
嗨,我有2個表,結構如下
cdr
src | bill sec | clean_dst
------------------------------
100 | 10 | 18006927753
100 | 22 | 18006927753
100 | 9 | 441138973356
dialing_codes
id | dial_code | tele2id
-----------------------------
1 | 1 | 1422
2 | 1800 | 1433
3 | 441 | 1024
4 | 4413 | 1086
我需要獲得與清潔_dst最接近的Dial_code匹配的tele2id
$query = "SELECT tele2id, dial_code FROM dialing_codes ORDER by dial_code DESC";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);
while($row = $result->fetch_assoc()) {
$tele2id = $row['tele2id'];
$dialcode = $row['dial_code'];
$query2 = "SELECT clean_dst FROM cdr WHERE clean_dst LIKE '".$dialcode."%'";
$result2 = $mysqli->query($query2) or die($mysqli->error.__LINE__);
while($row2 = $result2->fetch_assoc()) {
我以為是可行的,但仔細檢查,如果重復執行clean_dst,它只會在第一次時返回正確的結果
例如
clean_dst dial_code tele2id
18006927753 1800 1433
18006927753 1 1422
我究竟做錯了什么? 謝謝
如果有幫助,我需要數字最匹配的結果嗎?
請嘗試以下查詢:
select dial_code, clean_dst from cdr c, dialing_codes d where c.clean_dst
like concat(d.dial_code, '%');
您無需在php中編寫所有邏輯代碼。 MySQL為您提供了在SQL中進行本機處理的功能和比較,它更簡單,更簡潔。
希望這可以幫助。
盡管不在php中,但這個sql可以一次處理您的第一個和第二個查詢...並且正確處理每個撥號返回最長匹配項的操作。
select
PQ.clean_dst,
PQ.dial_code,
PQ.tele2id,
@Rank := if( @lastDst = PQ.clean_dst, @Rank +1, 1 ) as dialRank,
@lastDst := PQ.clean_dst as ForNextRowCompare
from
( SELECT distinct
cdr.clean_dst,
dc.dial_code,
dc.tele2id,
length( trim( dc.dial_code )) as Longest
from
cdr
JOIN dialing_codes dc
on cdr.clean_dst like concat( dc.dial_code, '%' )
order by
cdr.clean_dst,
Longest DESC ) PQ,
( select @lastDst := '',
@Rank := 0 ) sqlvars
having
dialRank = 1
第一部分是內部查詢,產生別名“ PQ”(preQuery)。 它會獲取任何呼叫數據記錄與其匹配的POSSIBLE撥號代碼的不同組合的列表。 至關重要的組成部分是按撥打的每個電話號碼進行排序,然后根據最長的撥號代碼降序排列。 這樣會將您使用的“ 1800”放在每個電話號碼列表的頂部。
接下來是外部查詢,其中應用了MySQL @variables。 這些工作對您來說就像是在線編程循環,適用於“ PQ”結果集中的每條記錄。 它分別以空白和零開始變量。
每個記錄都會將其撥打的電話號碼與上次撥打的電話號碼記錄進行比較(例如1800和1個多重回撥集)。 如果它們是同一部電話,則將1添加到現有的@Rank中,否則,這是電話號碼的更改...始終將電話號碼更改回第1級。然后,將@lastDst分配給它的電話號碼剛剛處理過,因此它可以成為測試下一條電話記錄的基礎。
最后是HAVING子句,僅包含DialRank = 1的子句
因此,根據您的記錄集樣本,查詢將導致記錄看起來像...
Dial Number Dial_Code Tele2ID Longest DialRank ForNextRowCompare
18006927753 1800 1433 4 1 18006927753 <-- Keep this
18006927753 1 1422 1 2 18006927753
441138973356 441 1024 3 1 441138973356 <-- Keep this
每個評論的反饋。 要處理您的更新,您可以將其打包
update cdr,
( full query ) as FromThisQuery
where cdr.clean_dst = FromThisQuery.clean_dst
set tele2id = FromThisQuery.tele2id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.