SQL:当column2!= y时查询column = x的位置;当列2 = x..if时,y =列是有意义的

时间:2013-03-06 06:15:40

标签: mysql sql

所以我有这张桌子:

PK | FK1 | FK2
1  | 1   | 2
2  | 1   | 3
3  | 1   | 6
4  | 2   | 1
5  | 2   | 6
6  | 5   | 3

PK是主键(dur)。 FK1和FK2是其他表中相同列的外键(不是相关的)。

查询类型1

我希望获得FK1 = x的所有行。但与此同时,我不想包含FK2 = y的行; y是FK1,其中FK2 = x。另一种说法:FK1 = x,但FK2不能等于FK2 = x的表中FK1的任何值。例如,x = 1:

PK | FK1 | FK2 | Returned in Result Set (Yes = √, No = x)
1  | 1   | 2   | x
2  | 1   | 3   | √
3  | 1   | 6   | √
4  | 2   | 1   | x
5  | 2   | 6   | x
6  | 5   | 3   | x

注意,结果集中不包括PK> = 4的行,因为FK1!= 1.但是,结果集中不包括PK = 1的行,但FK1 = 1。为什么?因为FK2 = 2,这是当FK2 = x时的FK1等于或PK = 4的行时的1。如果你遇到麻烦,请多读几次。

查询类型2

这几乎就像第一种查询类型。我想获得FK2 = x和FK1!= y的所有行,其中y = FK2,其中FK1 = x。它是相同的,只有列是相反的。我的重点是FK2,而不是FK1。

查询类型3

我希望获得FK1 = x的所有行,仅当FK2 = y时; y = FK1,其中FK2 = x。希望你一直在用x和y来遵循这个约定,所以我不需要解释太多。这是一个例子,x = 1:

PK | FK1 | FK2 | Returned in Result Set (Yes = √, No = x)
1  | 1   | 2   | √
2  | 1   | 3   | x
3  | 1   | 6   | x
4  | 2   | 1   | x
5  | 2   | 6   | x
6  | 5   | 3   | x

只返回第一行,PK = 1.为什么?因为FK1 = x或1,而FK2 = y或2,即FK1,其中FK2 = 1(第4行)。

伙计,我希望这是有道理的。告诉我哪里开始没有意义,我会编辑。

感谢阅读。感谢所有帮助。

1 个答案:

答案 0 :(得分:2)

如果我理解正确的话,所有3个都是相当简单的连接;

第一个左连接查找FK1 = 1的所有行,并过滤掉所有与FK1和FK2相反的匹配对的行;

SELECT t1.* 
FROM table1 t1
LEFT JOIN table1 t2
  ON t1.FK1=t2.FK2 
 AND t1.FK2=t2.FK1
WHERE t2.PK IS NULL
AND t1.FK1 = 1;

第二个是相同查询的反向,发现FK2 = 1。

SELECT t1.* 
FROM table1 t1
LEFT JOIN table1 t2
  ON t1.FK1=t2.FK2 
 AND t1.FK2=t2.FK1
WHERE t2.PK IS NULL
AND t1.FK2 = 1;

第三个是直接加入,没有特价。

SELECT t1.*
FROM table1 t1
JOIN table1 t2
  ON t1.FK2=t2.FK1
 AND t1.FK1=t2.FK2
WHERE t1.FK1 = 1;

An SQLfiddle for testing