当前位置: 首页 > 知识库问答 >
问题:

如何透明地通过中间表连接

闾丘诚
2023-03-14

假设我有两张桌子:

联系人

活动

我可以执行一个简单的左联接来检索可能具有某种类型activity的联系人:

SELECT name, subject
FROM Contacts c
LEFT JOIN Activities a ON a.contact_id = c.id AND a.type = 'Meeting'

这将给我所有的联系人,如果他们有任何会议:

注意,我为Jane得到了两行,因为她有两个会议。我没有为Bob获得2行,即使他有2个活动,因为它们被ON子句排除了。我也为莎莉吵架,尽管她没有任何活动。

好吧,这就是我想要做的,但麻烦的是我的模式看起来不是那样的。它有一个中介表(因为多个联系人可能是activity的一部分)。真实的模式如下所示,但没有contact_id列用于活动:

联系人

活动

Activity_Contact

这就是我被困住的地方。如何执行从联系人到活动的相同类型的左联接?如果我向查询中添加两个联接,那么Bob最终会出现重复的行(因为他在Activity_Contact表中有两个条目,尽管第二个联接排除了他的活动):

SELECT name, subject
FROM Contacts c
LEFT JOIN Activity_Contact ac ON ac.contact_id = c.id
LEFT JOIN Activities a ON a.id = ac.activity_id AND a.type = 'Meeting'

我可以使用groupby只获得一个Bob,但这也会压缩Jane的行。

我真正想要的是通过中介表透明地加入,就好像它根本就不在那里一样。在MySQL中有办法做到这一点吗?

共有1个答案

常培
2023-03-14

只需使当前的selectdistinct能够提供您想要的行为:

SELECT DISTINCT c.name, c.subject
FROM Contacts c
LEFT JOIN Activity_Contact ac ON ac.contact_id = c.id
LEFT JOIN Activities a ON a.id = ac.activity_id AND a.type = 'Meeting';

注意:通过按名称主题分组,可以得到与上面相同的结果。

 类似资料:
  • 我在Tomcat服务器上部署了一个SpringBoot应用程序,它使用Spring接收请求并向其他服务发出其他HTTP REST请求。 在传入的请求中,有一个< code>CORRELATION_ID HTTP头,用于跟踪请求。我希望对其他服务的任何请求也有这个头,这样我就可以关联不同服务器上的日志。 我如何在不更改现有代码的情况下实现这一点? 是否有任何 ,我可以在引导时的某个位置设置,以便它拦

  • 如何仅在Laravel(5.4)中的pivot(中间)表中创建一列,然后对其结果进行过滤? 我有两个模特,电影和剧组。CastAndCrew是为一部电影工作的各种导演、制片人和演员。透视表应定义CastAndCrew成员与电影之间的关系类型。很明显,有人可能在一部电影中扮演演员,在另一部电影中扮演制片人,所以我不能在CastAndCrew表中的条目中定义这一点,因为这只适用于一部电影,对于他们拍摄

  • 问题内容: 如何使JFrame透明?我想使我的JFrame透明。当我的JFrame位于顶部时,用户应该会看到背景。 问题答案: 如果您对使用受限的API类没有异议,则可以使用该类的类和方法来实现。这里和这里是有关如何使用它的教程?而这里是使用Java本地接入的版本。 代码示例

  • 问题内容: 我想自定义外观,因此我创建了一个自定义类,扩展了JPopupMenu类,从而覆盖了该方法,就像我对需要自定义的任何组件所做的那样。 我唯一正确知道的问题是我无法透明。我虽然足够,但我错了。 我该如何做透明的? 问题答案: 弹出菜单的问题在于它可能被实现为顶级容器(Window),并且窗口是不透明的,无论您用setOpaque()设置了什么值(不透明)。但是窗口也可以做成半透明的。 您可

  • 我正在使用matplotlib制作一些图形,不幸的是,我不能在没有白色背景的情况下导出它们。 换句话说,当我导出这样的绘图并将其放置在另一个图像的顶部时,白色背景会隐藏其背后的内容,而不是让它显示出来。如何导出具有透明背景的绘图?

  • 问题内容: 这是关于如何通过Docker连接到本地服务的更普遍的问题。有在Github上的问题类似的问题在这里,似乎并未有任何决议。我真正想要的是能够针对本地开发MySQL服务器在本地进行开发,然后一旦准备好进行部署,就可以针对新创建的部署候选docker映像进行本地测试。 理想情况下,两者都可以从同一位置获取设置,所以我可以放。这似乎是一个典型的用例。目前有这种可能吗? 我正在将Boot2Doc