代码之家  ›  专栏  ›  技术社区  ›  hamburger

mySQL中如何处理电话号码等多个字段

  •  0
  • hamburger  · 技术社区  · 8 年前

    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轻松地捕捉它?

    2 回复  |  直到 8 年前
        1
  •  2
  •   chris85 Ferenc Kurucz    8 年前

    group_concat 具有 group 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

        2
  •  1
  •   user4113344 user4113344    8 年前

    不要将演示数据与逻辑混为一谈 .

    事实上你没有 需要

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