Mysql 如何在一次选择中返回多个值

Mysql 如何在一次选择中返回多个值,mysql,row,multiple-select,Mysql,Row,Multiple Select,我正在将数据从MySQL转换到Postgres,在Postgres数据库中,电话号码作为单独的字段存储在客户表中,即电话家庭,电话工作,电话传真,Cellular但是在MySQL中,电话号码存储在自己的表中telnos 我的问题是如何在一个select语句中获得表telnos中找到的所有电话号码(可能为空-4)在一行中最多返回4个单独的字段,而不是4个单独的记录/行 这是我尝试过的,但没有成功,因为每个客户最多可以存储4个可能的数字 Select A.Name,A.surname,B1.

我正在将数据从MySQL转换到Postgres,在Postgres数据库中,电话号码作为单独的字段存储在客户表中,即电话家庭电话工作电话传真Cellular但是在MySQL中,电话号码存储在自己的表中telnos

我的问题是如何在一个select语句中获得表telnos中找到的所有电话号码(可能为空-4)在一行中最多返回4个单独的字段,而不是4个单独的记录/行

这是我尝试过的,但没有成功,因为每个客户最多可以存储4个可能的数字

    Select A.Name,A.surname,B1.number,B2.number
     from Customer A
    left join telnos B1 on A.telno=B1.id
    left join telnos B2 on A.telno=B2.id and B2.number<>B1.number
表Customer和telnos的结构

  Customer  (How I want the result to be stored in new table Customer)
  ========
  Name      varchar(25)
  Surname   varchar(30)
  Tel_Home  varchar(15)
  Tel_Work  varchar(15)
  Tel_Fax   varchar(15)
  Cellular  varchar(15)

   Telnos                            Customer
   ======                            ========
   id          Integer(6)            Id        Integer(6)
   Description varchar(10)           Name      varchar(25)
   Number      varchar(12)           Surname   varchar(30)
                                     telno     Integer(6) FK of telnos

您可以使用如下查询:

SELECT c.*
, GROUP_CONCAT(IF(nr = 0 ,t.`Number`,'') SEPARATOR '') AS tel1
, GROUP_CONCAT(IF(nr = 1 ,t.`Number`,'') SEPARATOR '') AS tel2
, GROUP_CONCAT(IF(nr = 2 ,t.`Number`,'') SEPARATOR '') AS tel3
, GROUP_CONCAT(IF(nr = 3 ,t.`Number`,'') SEPARATOR '') AS tel4
FROM Customer c
LEFT JOIN (
    SELECT t.*
    , @nr:=(@nr+1) 
    ,@nr:=IF(@lid = t.id,@nr,0) AS nr
    ,@lid:=t.id
    FROM telnos t
    CROSS JOIN (SELECT @nr:=0, @lid:=-1) AS INIT
) t ON t.id = c.telno
GROUP BY c.id;
示例表

mysql> select * FROM Customer;
+----+-------+---------+-------+
| id | Name  | Surname | telno |
+----+-------+---------+-------+
|  1 | BERND | BUFFEN  |   123 |
|  2 | JOHN  | DOH     |   124 |
|  3 | PETER | PAN     |   125 |
+----+-------+---------+-------+
3 rows in set (0,00 sec)

mysql> select * from telnos;
+-----+-------------+--------+
| id  | Description | Number |
+-----+-------------+--------+
| 123 | nr1         | 121    |
| 123 | nr2         | 122    |
| 123 | nr3         | 123    |
| 123 | nr4         | 124    |
| 124 | nr1         | 231    |
| 124 | nr2         | 232    |
| 125 | nr1         | 341    |
+-----+-------------+--------+
7 rows in set (0,00 sec)
示例查询

mysql> SELECT c.*
    -> , GROUP_CONCAT(IF(nr = 0 ,t.`Number`,'') SEPARATOR '') AS tel1
    -> , GROUP_CONCAT(IF(nr = 1 ,t.`Number`,'') SEPARATOR '') AS tel2
    -> , GROUP_CONCAT(IF(nr = 2 ,t.`Number`,'') SEPARATOR '') AS tel3
    -> , GROUP_CONCAT(IF(nr = 3 ,t.`Number`,'') SEPARATOR '') AS tel4
    -> FROM Customer c
    -> LEFT JOIN (
    ->     SELECT t.*
    ->     , @nr:=(@nr+1)
    ->     ,@nr:=IF(@lid = t.id,@nr,0) AS nr
    ->     ,@lid:=t.id
    ->     FROM telnos t
    ->     CROSS JOIN (SELECT @nr:=0, @lid:=-1) AS INIT
    -> ) t ON t.id = c.telno
    -> GROUP BY c.id;
+----+-------+---------+-------+------+------+------+------+
| id | Name  | Surname | telno | tel1 | tel2 | tel3 | tel4 |
+----+-------+---------+-------+------+------+------+------+
|  1 | BERND | BUFFEN  |   123 | 121  | 122  | 123  | 124  |
|  2 | JOHN  | DOH     |   124 | 231  | 232  |      |      |
|  3 | PETER | PAN     |   125 | 341  |      |      |      |
+----+-------+---------+-------+------+------+------+------+
3 rows in set (0,00 sec)

mysql>

您能告诉我您的表(客户和电话号码)结构是什么吗?客户名称varchar(25),姓氏varchar(30),电话家庭varchar(15),电话工作vachar(15),电话传真varchar(15),蜂窝varchar(15)电话号码ID整数(6),描述varchar(10),号码varchar(12)表名在哪里telnos中的描述是否与tel1一样恒定?
mysql> SELECT c.*
    -> , GROUP_CONCAT(IF(nr = 0 ,t.`Number`,'') SEPARATOR '') AS tel1
    -> , GROUP_CONCAT(IF(nr = 1 ,t.`Number`,'') SEPARATOR '') AS tel2
    -> , GROUP_CONCAT(IF(nr = 2 ,t.`Number`,'') SEPARATOR '') AS tel3
    -> , GROUP_CONCAT(IF(nr = 3 ,t.`Number`,'') SEPARATOR '') AS tel4
    -> FROM Customer c
    -> LEFT JOIN (
    ->     SELECT t.*
    ->     , @nr:=(@nr+1)
    ->     ,@nr:=IF(@lid = t.id,@nr,0) AS nr
    ->     ,@lid:=t.id
    ->     FROM telnos t
    ->     CROSS JOIN (SELECT @nr:=0, @lid:=-1) AS INIT
    -> ) t ON t.id = c.telno
    -> GROUP BY c.id;
+----+-------+---------+-------+------+------+------+------+
| id | Name  | Surname | telno | tel1 | tel2 | tel3 | tel4 |
+----+-------+---------+-------+------+------+------+------+
|  1 | BERND | BUFFEN  |   123 | 121  | 122  | 123  | 124  |
|  2 | JOHN  | DOH     |   124 | 231  | 232  |      |      |
|  3 | PETER | PAN     |   125 | 341  |      |      |      |
+----+-------+---------+-------+------+------+------+------+
3 rows in set (0,00 sec)

mysql>