簡體   English   中英

MYSQL查詢與第二張表最匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM