当前位置: 首页 > 面试题库 >

SQL从具有不同类型(移动电话,家庭电话)的多对多表中选择电话号码

阮雅达
2023-03-14
问题内容

我有一个简单的表架构:

Person: ID, Name
PhoneNumber: ID, Type, Number                    #Type can be 'home' or 'mobile'.
PersonPhoneNumber: ID, Person_ID, PhoneNumber_ID #A join table that connects the
                                                 #person to a phone number.

作为数据,我有:

Person: 1, "Ed"
PhoneNumber: 1, "home", 1111
PhoneNumber: 2, "mobile", 2222
PersonPhoneNumber: 1, 1 /*(Person_ID)*/, 1 /*(PhoneNumber_ID*/
PersonPhoneNumber: 2, 1 /*(Person_ID)*/, 2 /*(PhoneNumber_ID*/

我想写一个返回的视图:

Name    |Home    |Mobile
-----------------------------
"Ed"     1111     2222
"Joe"    3333     4444
... etc

关于我如何处理此问题的任何提示?

注意:这些表是较大模式的摘录,它解释了为什么这么多对多而不简单的原因。


问题答案:

如果您有多个数字或可能有多个家庭/移动电话,则可以用更复杂的方式执行此操作,但是目前,如果只有两个数字,则可以使用:

SELECT Name, HomeNumber.Number AS Home, MobileNumber.Number AS Mobile
FROM Person
    LEFT JOIN PersonPhoneNumber HomeMap
        ON Person.ID = HomeMap.Person_ID
    LEFT JOIN PhoneNumber HomeNumber
        ON HomeMap.PhoneNumber_ID = HomeNumber.ID AND HomeNumber.Type = 'home'
    LEFT JOIN PersonPhoneNumber MobileMap
        ON Person.ID = MobileMap.Person_ID
    LEFT JOIN PhoneNumber MobileNumber
        ON MobileMap.PhoneNumber_ID = MobileNumber.ID AND MobileNumber.Type = 'mobile'

顺便说一句,如果您不希望有人有任何数字,则可以将PersonPhoneNumber映射设为aJOIN而不是aLEFT JOIN



 类似资料:
  • 我看到了一些与我要求的相似的问题,但似乎没有什么符合要求的。 我处于需要处理通话记录并使用电话号码确定国家的位置。拨打的号码可以是任何国家,例如: 44 7899455120-英国 34 965791845-西班牙 355 788415235-阿尔巴尼亚 显然,如果所有的呼叫代码都是两位数的话,这个世界将是美好的,但事实并非如此。目前,我有一个数据库,里面有国家及其相关代码,为了匹配,我需要有效地

  • 我应该如何更改getPhoneNumber内部的代码才能正确工作,有什么想法吗?这是我最后应该得到的+38(050)123-45-67。38是国家代码,这是电话号码501234567,但你必须在数字开头放零才能得到10个类似于这里的数字(>0<50) 完整的代码。

  • 9,23日 20min 突然打电话面我, 本科双非,硕士211, 投的嵌入式测试岗(我都不记得我投过这个所,这个岗, 突然打电话让我懵了) 简要说明你的项目做了啥? TCP和UDP的区别 聊不了解测试? 线程和进程的区别 C++STL简单说明 然后开始问我有什么想了解的? 交流之后结束,以为有戏, 结果至今没信. update: 10.11 下午 收到HR电话,邀面,已拒 #中电##中电三十二所#

  • 我想从应用程序拨打电话。 是否可以将选项限制为仅从内置电话应用程序呼叫,而不将Viber,Skype或Whatsapp显示为选项? 以下是我的代码: 我想看起来像这样: 而不是这样(如果我已经安装了Viber和Skype): 我尝试使用以下代码: 这让Skype成为一种选择,我也不知道为什么?

  • 如果您在Nuxt页面中包含电话号码,请确保将它们直接包装到链接中: <!-- Example phone number: +7 (982) 536-50-77 --> <template> <a href="tel: +7 (982) 536-50-77">+7 (982) 536-50-77</a> </template> 否则,某些移动Safari版本会自动将这些数字转换为链接。 听起

  • 背景: 我为android写了一个简单的小拨号器,可以拨打联系人的电话号码 问题: 我想打电话给联系人,而不是电话号码,这样Android: 如果联系人有两个号码:将启动电话号码选择对话框,然后启动通话 当然,我可以从头开始实现一个弹出窗口,但我更愿意委托给一个标准操作,这样用户就可以使用与使用标准拨号器相同的用户体验。