- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下表格:
team: identifier, name
fan: identifier, name
team_fan: team_identifier, fan_identifier
换句话说,球队和球迷之间是多对多的关系。
我想获取满足特定条件的所有团队;对于每个选定的团队,我想获取其所有粉丝。因此,在我的应用程序中,我希望具有以下数据结构:
Team A
Fan F1
Fan F2
Team B
Fan F1
Fan F3
Team C
Fan F2
Fan F3
Fan F4
我已经想出了以下解决方案:
[0] 默认,典型方法
默认的典型方法是内部连接:
select team.name, fan.name
from team
inner join team_fan
on team.identifier = team_fan.team_identifier
inner join fan
on team_fan.fan_identifier = fan.identifier
where ... (team conditions)
这提供了构建上述数据结构所需的所有信息。
有很多球队,球迷可以属于多个球队。上面的查询可能不是一个好主意,因为团队和粉丝在结果中是重复的。所有这些副本都需要通过网络传输。
在下面的备选方案中,我在应用程序中执行 JOIN。下面的替代方案可能会更慢,但我还不知道。我想从中比较和学习。
[1] 非常幼稚的做法
首先,我们选择所有团队:
select name from team where ...
然后,对于标识符为 X 的每个团队,我们选择其粉丝:
select name
from fan
where exists(select 1 from team_fan where team_identifier = X)
这是一个糟糕的解决方案,因为所需查询的数量是1 + 团队数量
。此外,多次提取属于多个团队的粉丝。我们可以做得更好。
[2] 自上而下的方法
首先,我们选择所有团队。在这样做的同时,我们还将属于该团队的所有粉丝收集到一个数组中:
select name, array(select identifier
from fan
where exists(select 1 from team_fan where fan.identifier = team_fan.fan_identifier and team.identifier = team_fan.team_identifier)) as fans
from team
where ...
然后,在我们的应用程序中,我们构建了所有粉丝标识符的联合。给定这组粉丝标识符,我们可以选择所有粉丝:
select name from fan where identifier in(...)
现在,我有足够的信息在我的应用程序中复制 JOIN 并构建数据结构,如上所示。
这似乎是一个更好的解决方案。查询次数始终为 2。此外,每个团队和每个粉丝只获取一次。
[3] 自下而上的方法
我将之前的解决方案称为自上而下
,因为我们正在向父级(团队)添加一组子级(粉丝)。在这种方法中,我们做相反的事情:我们将 parent (团队)数组添加到 child (粉丝)。
所以,首先,让我们选择所有团队:
select name from team where ...
接下来,在我们的应用程序中,我们构造所有团队标识符的并集。鉴于这组球队标识符,我们可以选择所有球迷:
select name, array(select team_fan.team_identifier from team_fan where fan_identifier = fan.identifier and team_identifier in(...))
from fan
where exists(select 1 from team_fan where fan_identifier = fan.identifier and team_identifier in(...));
现在,我有足够的信息在我的应用程序中复制 JOIN 并构建数据结构,如上所示。
这似乎也是一个有效的解决方案。同样在这种情况下,查询的数量始终为 2。此外,每个团队和每个粉丝只被获取一次。
我的问题
所以,回到我的问题:我想获取满足特定条件的所有团队;对于每个选定的团队,我想获取其所有粉丝。
目前,我不确定方法 2 是否优于方法 3(反之亦然),甚至不确定是否有更好的方法。欢迎任何见解。
最佳答案
做一个简单的连接
Select
t.identitfier team_identifier
,t.name team_name
,f.identitfier fan_identifier
,f.name fan_name
From team t
inner join team_fan tf
on t.identifier=tf.team_identifier
/* and --(team condition can be put here) */
inner join fan f on tf.fan_identifier=f.identifier
/*where ... --(or team condition can be put here)*/
关于sql - 获取多对多关系的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45735285/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!