2017-07-28 67 views
0

我認爲這是一個經典的SQL問題,但我無法在Internet上找到任何提示。如何處理多個字段,如mySQL中的電話號碼

我的數據庫表有:

Table User: 
ID UserName Adress 
1 Uwe  No 1 
2 user2 No 2 
3 name3 No 3 


Table Tel: 
ID telNumber user_id 
1 123  1 
2 234  1 
3 123  2 
4 567  1 
5 900  3 
6 800  3 
7 111  1 

有了這個選擇:

SELECT user.UserName, tel.telNumber, user.Adress 
FROM [user] INNER JOIN tel ON user.ID = tel.user_id; 

我會得到:

UserName Tel  Adress 
--------------------------- 
Uwe  123  No 1  
Uwe  234  No 1  
user2  123  No 2  
Uwe  567  No 1  
name3  900  No 3  
name3  800  No 3  
Uwe  111  No 1  
---------------------------- 

什麼我'找東西現在這個樣子:

Name: Uwe 
Tel1: 123 
Tel2: 234 
Tel3: 567 
Tel4: 111 
Adress: No 1 


Name: name3 
Tel1: 900 
Tel2: 800 
Adress: No 3 

我該如何得到這個結果?我如何調整我的SQL語句,以便通過PHP獲得一個舒適的方式來捕獲它?

+0

只是爲了您現有的通過名稱或USER_ID,然後連接查詢只是循環的結果。你想要的輸出應該由你的PHP代碼生成,而不是數據庫。如果您按用戶對查詢進行排序,則會更容易,但除此之外,您已經處於正確的軌道。 – Simba

回答

2

您可以使用group_concatgroup by來獲取每個用戶的電話號碼。然後,您可以使用爆炸或其他功能來拆分電話號碼並對其進行迭代。例如:

SELECT u.UserName, group_concat(t.telNumber) as numbers, u.Adress 
FROM user as u 
INNER JOIN tel as t 
ON u.ID = t.user_id 
group by u.ID 

SQL演示:http://sqlfiddle.com/#!9/6dca9b/3

PHP實施將是這樣的:

<?php 
$numers = array('User1' => '1', 'User2' => '123,456'); 
foreach($numers as $user => $num){ 
    echo $user . PHP_EOL; 
    if(strpos($num, ',') === FALSE) { 
     echo 'Tel1:' . $num .PHP_EOL; 
    } else { 
     $nums = explode(',', $num); 
     foreach($nums as $key => $temp){ 
      echo 'Tel' . ($key + 1) . ':' . $temp .PHP_EOL; 
     } 
    } 
} 

演示:https://3v4l.org/OE3IA

+0

好主意chris – hamburger

1

作爲一條經驗法則:不要將演示數據與邏輯混合。

實際上你並不需要需要 SQL查詢返回記錄的共同主題列表的序列號。這些細節最好留給應用程序層,即您的PHP代碼。讓你的PHP代碼「知道」時,它的上市電話號碼給定用戶(這應該是微不足道的)和一個枚舉的方式呈現出來,就像你所示(僞代碼):

for each user: 
    i = 0 
    for each 'user' phone number: 
     i++ 
     show phone number (i) 
    next 
next 

它(一般)對於知道哪個電話處於哪個位置比知道你已經爲用戶準備好更重要。

相關問題