使用单查询通过连接两个表来检索多值属性,而不会导致mysql中的字段重复

使用单查询通过连接两个表来检索多值属性,而不会导致mysql中的字段重复,sql,mysql,join,crosstab,Sql,Mysql,Join,Crosstab,表1: 查询:创建表客户端( applicationNo int主键, 名称varchar(20) ); Insert语句:插入客户机值(1,'XYZ'),(1,'ABC'),(1,'DEF') 应用程序编号|名称 1 | XYZ 2 | ABC 3 | DEF 表2: 查询:创建表客户端( 应用程序无int, PhoneNoBigint, 外键(applicationNo)引用客户端(applicationNo), 主键(应用程序号、电话号) ); 插入phoneNO值(1999999)、

表1:
查询:创建表客户端( applicationNo int主键, 名称varchar(20) );

Insert语句:插入客户机值(1,'XYZ'),(1,'ABC'),(1,'DEF')

应用程序编号|名称 1 | XYZ 2 | ABC 3 | DEF 表2:
查询:创建表客户端( 应用程序无int, PhoneNoBigint, 外键(applicationNo)引用客户端(applicationNo), 主键(应用程序号、电话号) );

插入phoneNO值(1999999)、(188888)、(2777777)、(3666666)、(355555)

应用程序编号|电话号码 1 | 999999 1 | 888888 2 | 777777 3 | 666666 3 | 555555 我可以通过连接两个表来检索元组吗?这种连接方式可以获得以下输出,但是使用单一查询,我也使用mysql 5.1

applicationNo | name | phoneNo1 | phoneNo2 1 | XYZ | 999999 | 88888 2 | ABC | 77777 | Null 3 | DEF | 66666 | 555555 申请编号|姓名|电话号码1 |电话号码2 1 | XYZ | 999999 | 88888 2 | ABC | 77777 |空 3 | DEF | 66666 | 555555 编辑:额外信息
我试着使用这个叫做交叉表的东西,但是我不能在case语句中使用totalPhoneNo

SELECT applicationNo,count(phoneNo) as totalPhoneNo, SUM(CASE WHEN totalPhoneNo= 1 THEN phoneNO ELSE Null END) AS phoneNo1, SUM(CASE WHEN totalPhoneNO = 2 THEN phoneNo ELSE Null END) AS phoneNo2 FROM phoneNO GROUP BY applicationNo; 选择applicationNo,将(phoneNo)计数为totalPhoneNo, 总和(totalPhoneNo=1时的情况,然后phoneNO-ELSE为空结束)为phoneNo1, 总和(totalPhoneNO=2时的情况,然后phoneNo-ELSE为空结束)为phoneNo2 按应用程序编号从phoneNO组中删除;
这是给MSSQL的。这个转换得好吗

With phones (ApplicationNo, PhoneNo, Instance) as
(Select ApplicationNo, PhoneNo,
  Row_Number OVER (Partition By ApplicationNo) as RowNum)
Select client.ApplicationNo, client.Name, 
  p1.PhoneNo as phoneNo1, p2.PhoneNo as phoneNo2
From client
  Left Join phones p1 on client.ApplicationNo=p1.ApplicationNo as p1.RowNum=1
  Left Join phones p2 on client.ApplicationNo=p2.ApplicationNo as p2.RowNum=2

将子选择与限制子句一起使用。第一个子选择选择第一部手机,另一部选择第二部手机

select ApplicationNo,
(SELECT phoneno FROM phones where phones.applicationno=app.ApplicationNo order by phoneno LIMIT 0, 1)as phone1,
(SELECT phoneno  FROM phones where phones.applicationno=app.ApplicationNo order by phoneno LIMIT 1, 1)as phone2
from application app
尝试:


每个应用程序最多有2个电话号码吗否?是的。一个客户端最多可以有2个电话号码n最小1个号码。感谢您的回答,但我无法将此查询转换为mysql语法:(.hey cody thnx,您的答案,但问题是子查询提取相同的电话号码(表中的第一个和第二个phnNo)对于每个应用程序,我都为“应用程序”添加了一个别名,并为子选择添加了一个“订购人”。它现在起作用了吗?终于成功了!!谢谢你,马克:)这对我起作用了。非常抱歉,我不能投票支持这个答案。它说我需要15个声誉:(但无论如何,我感谢所有对回答这个问题感兴趣的人。非常感谢
With phones (ApplicationNo, PhoneNo, Instance) as
(Select ApplicationNo, PhoneNo,
  Row_Number OVER (Partition By ApplicationNo) as RowNum)
Select client.ApplicationNo, client.Name, 
  p1.PhoneNo as phoneNo1, p2.PhoneNo as phoneNo2
From client
  Left Join phones p1 on client.ApplicationNo=p1.ApplicationNo as p1.RowNum=1
  Left Join phones p2 on client.ApplicationNo=p2.ApplicationNo as p2.RowNum=2
select ApplicationNo,
(SELECT phoneno FROM phones where phones.applicationno=app.ApplicationNo order by phoneno LIMIT 0, 1)as phone1,
(SELECT phoneno  FROM phones where phones.applicationno=app.ApplicationNo order by phoneno LIMIT 1, 1)as phone2
from application app
select c.applicationNo, 
       max(c.name) name,
       max(p.phoneNo) phoneNo1,
       case 
           when max(p.phoneNo) = min(p.phoneNo) then NULL 
           else min(p.phoneNo) 
       end phoneNo2
from client c
left join phoneNo p on c.applicationNo = p.applicationNo
group by c.applicationNo