2013-04-03 36 views
0

您好,我正在寻求帮助,我的查询当前运行没有错误,但不显示数据,因为我也需要它。我的表存储电话号码,相关字段是id,phonetype和phonenumber。如果将行选择为多列

运行时,虽然它只显示最后一个数字,但它会按预期方式返回列id,HOME PHONE,WORK PHONE,CELL PHONE。假设在给定行中有家庭电话和工作电话号码...我只在该工作电话的WORK PHONE列中获取数据。如果连续存在家庭电话,工作电话和手机...我只能在CELL PHONE列中获取数据。

我需要在phonetype类型的唯一列中给定id的所有电子形式的一行。我希望是有道理的,如果没有查询应该给你一个想法是什么即时寻找...感谢

SELECT id, 
(IF(phonetype = 'HOME PHONE', phonenumbers.phonenumber, '')) AS 'HOME PHONE', 
(IF(phonetype = 'WORK PHONE', phonenumbers.phonenumber, '')) AS 'WORK PHONE', 
(IF(phonetype = 'CELL PHONE', phonenumbers.phonenumber, '')) AS 'CELL PHONE' 
FROM phonenumbers 
GROUP BY id; 

表我查询看起来像这样

id | name | phonetype | phonenumber 

1 | Jim | HOME PHONE | 0000000001   
1 | Jim | WORK PHONE | 0000000002 
2 | Kim | HOME PHONE | 0000000003 
2 | Kim | WORK PHONE | 0000000004 
2 | Kim | CELL PHONE | 0000000005 

结果我我想找应该是这样的......

id | name | home phone | work phone | cell phone 

1 | Jim | 0000000001 | 0000000002 | 
2 | Kim | 0000000003 | 0000000004 | 0000000005 
+1

如果你有一个类型的话,如何能有一个工作电话和一个GIVEN行的手机?如果类型='WORK PHONE',它又怎么可能是'CELL PHONE'?看看这个查询并想象你的数据库,我会假设每行生成的行将填充一列,其他两列空白。 – 2013-04-03 22:38:25

+0

我看到我在哪里创建混乱,表中有每行人的多行phonetypes。所以Jim有自己的工作,家庭和单元号码。 – user2242491 2013-04-03 22:41:31

+0

没有混淆,这正是我对它的理解,但是随后你将得到Jim的多行结果,并且每行仍然只有一个值填充。我认为你希望合并这些个体行成单行结果,你可以用subseconds按照d'alar'cop的回答做 – 2013-04-03 22:48:02

回答

1

假定每个ID都有反对每种类型的只有一个电话号码:

SELECT a.id, 
(SELECT phonenumbers.phonenumber FROM phonenumbers WHERE phonetype = 'HOME PHONE' AND id = a.id) AS 'HOME PHONE', 
(SELECT phonenumbers.phonenumber FROM phonenumbers WHERE phonetype = 'WORK PHONE' AND id = a.id) AS 'WORK PHONE', 
(SELECT phonenumbers.phonenumber FROM phonenumbers WHERE phonetype = 'CELL PHONE' AND id = a.id) AS 'CELL PHONE' 
FROM phonenumbers a 
GROUP BY a.id; 

可能会有所帮助。 干杯。

+0

我强烈建议在每个子查询中加入“limit 1”,因为你一定会遇到你会遇到的情况给定用户迟早会得到多个结果,这会破坏一切。 – 2013-04-03 22:49:20

+0

我运行此解决方案并出现错误1242子查询返回多于1行。我相信这是由于我的描述不佳,每个ID有多个电话号码和电话类型。我将表格示例添加到原始帖子中,以帮助澄清即时消息的内容。谢谢 – user2242491 2013-04-03 23:10:57

+0

好吧,一个ID可能有很多HOME PHONE号码? - 他们是否有时间戳了有效性......你可以在子查询中用'distinct()'或'max()'来包装'phonenumbers.phonenumber',或者添加一个WHERE子句来得到最新的一个?让我知道。 – 2013-04-03 23:14:12