MySQL:选择字段与另一个表的所有相同字段匹配的外键

MySQL:选择字段与另一个表的所有相同字段匹配的外键,mysql,select,Mysql,Select,从我所读到的内容来看,这是一种使用除法运算符来完成的操作,但显然在MySQL中没有实现。基本上,我的设置是一个有两列的表,其中键被多次列出,第二列中有不同的列表,例如 PID | GID A1 | G1 A1 | G2 A2 | G1 A2 | G3 A3 | G1 A3 | G2 A4 | G2 A4 | G3 基本上,我必须根据PID和与之相关的所有GID找到表的子集,例如,分配A3的所有GID,这相当容易获得,生成一个中间表 PID | GID A3 | G1 A3

从我所读到的内容来看,这是一种使用除法运算符来完成的操作,但显然在MySQL中没有实现。基本上,我的设置是一个有两列的表,其中键被多次列出,第二列中有不同的列表,例如

PID | GID
A1  | G1
A1  | G2
A2  | G1
A2  | G3
A3  | G1
A3  | G2
A4  | G2
A4  | G3
基本上,我必须根据PID和与之相关的所有GID找到表的子集,例如,分配A3的所有GID,这相当容易获得,生成一个中间表

PID | GID
A3  | G1
A3  | G2

但给我带来麻烦的是如何在原始表中选择与子集表的所有GID匹配的记录。正如我所说的,我能找到的所有指向除法操作符的点,但在MySQL中不存在,所以我有点力不从心了。我想不出一种方法来加入或执行一个匹配所有GID的操作-只匹配部分匹配,这不是我要寻找的。有什么帮助吗?我正在看的这本书没有特别的帮助。

我不能100%确定这是你想要的,因为你的问题有点让人困惑,但我们会看到

您似乎在子查询之后:

SELECT pid, gid FROM your_table WHERE gid in (SELECT gid FROM your_table WHERE pid = 'A3')

这将从表中选择GID与PID“A3”关联的任何GID匹配的所有行。你可能需要慢慢地再读一遍……这是一个满嘴的内容。

那么你有一个GID列表,你想要所有包含列表中所有GID的PID

考虑到(例如,在您的过程语言中)您可以确定您拥有多少GID,一种非常奇怪但可行的方法是:

SELECT FROM the_table WHERE GID IN ('G1','G2') GROUP BY PID HAVING COUNT(*) = 2

好吧,问题是它将返回没有子查询中所有GID的PID。基本上,我需要这样做:如果PID与A3具有相同的GID,则只返回PID,如果是部分的,则拒绝它们。因此,在我给出的示例表中,只应返回A1,因为它是唯一一个同时使用G1和G2作为GID的表,与A3相同。对不起,如果这是所有有点混乱;我在谷歌上搜索任何帮助都有困难,主要是因为我不知道该怎么表达。好吧,我明白了。在MySQL中可能有一些深奥的方法(可能是条件),但在您的应用程序层中可能会更好地处理这个问题。让我们看看是否有更聪明的人分享了一个更好的方法。如果PID和GID没有直接的关系,那么你必须使用COUNT(不同的GID)。这实际上非常有效——这是我一直在尝试的东西,但我的语法错了;我想这是因为我试图计算不同的GID,这导致了问题。谢谢