2010-11-07 95 views
0

从我正在阅读的内容来看,这就是要用分区操作符完成的事情,但显然这不是在MySQL中实现的。基本上,我的设置是一个有两列的表格,其中键列出多次,第二列中有不同的列表,例如,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的操作 - 只有部分匹配,这不是我正在寻找的。任何帮助?我正在看的这本书不是特别有用。

回答

0

因此,你有一个GID列表,你想要所有的GID列表中的所有GID?

假设(例如,在你的程序语言),你可以决定有多少的GID有,相当奇怪,但可行的方法是这样的:

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

如果PID和GID不直接相关,则必须使用COUNT(DISTINCT GID)。 – AndreKR 2010-11-07 01:05:53

+0

这真的很漂亮 - 这是我尝试的,但我的语法错了;我认为这是因为我试图计算不同的GID,这导致了问题。谢谢! – Stuart 2010-11-07 17:13:10

0

我不是100%肯定这是你后,因为你的问题是有点混乱在做什么,但我们会看到......

你似乎是一个子查询后:

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

这将从您的表中选择GID与PID'A3'关联的任何GID匹配的所有行。你可能需要慢慢读一遍......这是一口。

+0

好了,有了,问题是,它会返回没有来自子查询的所有GID的PID。基本上,我需要这样做,以便只有PID具有与A3相同的所有GID时才会返回,并在部分时拒绝它们。因此,在我给出的示例表格的情况下,只有A1应该返回,因为它是唯一一个G1和G2都是GID的,与A3相同。对不起,如果这有点混乱;我在搜索帮助时遇到了困难,主要是因为我不确定如何使用它。 – Stuart 2010-11-07 01:05:43

+0

好吧,我陷入了困境。在MySQL中可能有一些深奥的方式(可能是条件),但是在应用程序层可能会更好地处理这个问题。让我们看看是否有人更聪明地分享更好的方式。 – coreyward 2010-11-07 01:13:44

相关问题