【问题标题】:Group phone numbers that correspond at the same url in the same row将同一行中相同 url 对应的电话号码分组
【发布时间】:2015-04-05 14:50:15
【问题描述】:

在数据库中有一些相同的行,其中仅更改电话号码。我想将对应相同 url 的单行电话号码分组,以获得第二个表。我想知道是否有办法在 mysql 中通过一个或多个查询或另一种方法来做到这一点。提前致谢

Database1
    Url    |Company Name| Address |  City |ZipCode|PHONE
www.aaa.com|         AAA|StreetAAA|CityAAA|  00000|0000000000
www.aaa.com|         AAA|StreetAAA|CityAAA|  00000|1111111111
www.aaa.com|         AAA|StreetAAA|CityAAA|  00000|2222222222
www.bbb.com|         BBB|StreetBBB|CityBBB|  11111|3333333333
www.ccc.com|         CCC|StreetCCC|CityCCC|  22222|4444444444
www.ccc.com|         CCC|StreetCCC|CityCCC|  22222|5555555555
www.ccc.com|         CCC|StreetCCC|CityCCC|  22222|6666666666
www.ddd.com|         DDD|StreetDDD|CityDDD|  33333|7777777777
www.ddd.com|         DDD|StreetDDD|CityDDD|  33333|8888888888
www.eee.com|         EEE|StreetEEE|CityEEE|  44444|9999999999

Final Database to generate:
    Url    |Company Name| Address |  City |ZipCode|  PHONE1  |  PHONE2  |  PHONE3
www.aaa.com|         AAA|StreetAAA|CityAAA|  00000|0000000000|1111111111|2222222222
www.bbb.com|         BBB|StreetBBB|CityBBB|  11111|3333333333|          |
www.ccc.com|         CCC|StreetCCC|CityCCC|  22222|4444444444|5555555555|6666666666
www.ddd.com|         DDD|StreetDDD|CityDDD|  33333|7777777777|8888888888|
www.eee.com|         EEE|StreetEEE|CityEEE|  44444|9999999999|          |

【问题讨论】:

  • 如果您想要提取的电话号码数量达到上限(根据 Gordon 的回答),这对 SQL 来说是可行的。但是,如果您不知道与一个地址相关联的数字的总数,最好将它们全部提取出来,并在一个脚本(可以遍历所有这些数字)或电子表格应用程序中以编程方式执行此操作。跨度>

标签: mysql sql xampp


【解决方案1】:

最简单的解决方案是将所有电话放入一个逗号分隔的列表中:

select url, companyname, address, city, zipcode,
       group_concat(phone) as phones
from database1
group by url, companyname, address, city, zipcode;

但是,这并不是您想要的。如果所有组都有三个电话号码,则以下方法更接近并且有效:

select url, companyname, address, city, zipcode,
       substring_index(group_concat(phone), ',', 1) as phone1,
       substring_index(substring_index(group_concat(phone), ',', 2), ',', -1) as phone2,
       substring_index(group_concat(phone), ',', -1) as phone3
from database1
group by url, companyname, address, city, zipcode;

所以,以下解决了这个问题:

select url, companyname, address, city, zipcode,
       (case when count(phone) >= 1
             then substring_index(group_concat(phone), ',', 1)
        end) as phone1,
       (case when count(phone) >= 2
             then substring_index(substring_index(group_concat(phone), ',', 2), ',', -1) 
        end) as phone2,
       (case when count(phone) >= 3
             then substring_index(group_concat(phone), ',', -1)
        end) as phone3
from database1
group by url, companyname, address, city, zipcode;

【讨论】:

  • 你好,如果我还要加上phone4和phone5,可以写sql吗?
  • @Francesco 。 . .只需复制“2”的行并将其替换为“3”和“4”即可。
  • 如果电话号码的数量可能发生变化,使用group_concat() 的第一个示例可能更容易,然后在脚本语言中拆分该字段的结果(由, 分隔默认)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多