【问题标题】:MySQL: Selecting foreign keys with fields matching all the same fields of another tableMySQL:选择具有与另一个表的所有相同字段匹配的字段的外键
【发布时间】:2010-11-07 00:49:30
【问题描述】:

从我读到的内容来看,这是用除法运算符来完成的事情,但显然这在 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 的操作 - 只有部分匹配,这不是我想要的。有什么帮助吗?我正在看的这本书并不是特别有用。

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    所以你有一个 GID 列表,并且你想要所有的 PID 都在列表中?

    鉴于(例如,在您的程序语言中)您可以确定有多少个 GID,这是一种相当奇怪但可行的方法:

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

    【讨论】:

    • 如果 PID 和 GID 没有直接关系,则必须使用 COUNT(DISTINCT GID)。
    • 这实际上效果很好 - 这是我正在尝试的东西,但我的语法错误;我认为这是因为我试图计算不同的 GID,这导致了问题。谢谢!
    【解决方案2】:

    我不能 100% 确定这就是你所追求的,因为你的问题有点令人困惑,但我们会看到......

    你似乎是在一个子查询之后:

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

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

    【讨论】:

    • 好吧,问题在于它会返回没有来自子查询的所有 GID 的 PID。基本上,我需要这样做,以便只有 PID 具有与 A3 相同的 GID 时才返回,如果它是部分的则拒绝它们。所以在我给出的示例表的情况下,应该只返回 A1,因为它是唯一一个同时具有 G1 和 G2 作为 GID 的表,与 A3 相同。对不起,如果这有点令人困惑;我在谷歌上搜索任何帮助时遇到了麻烦,主要是因为我不确定如何准确表达它。
    • 好的,我明白了。在 MySQL 中可能有一些深奥的方法(可能是条件),但这可能在您的应用程序层中处理得更好。让我们看看是否有更聪明的人分享更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多