这个问题本身很简单,但是我无法在一个查询中找到解决问题的方法,这是我对该问题的“抽象”,以便给出更简单的解释:
我将保留原先的解释,但这是一组示例数据和预期的结果:
好的,这是一些示例数据,我用空行分隔成对
------------- | Key | Col | (Together they from a Unique Pair) -------------- | 1 Foo | | 1 Bar | | | | 2 Foo | | | | 3 Bar | | | | 4 Foo | | 4 Bar | --------------
我期望的结果是, 在运行一次查询后 ,需要能够在一个查询中选择此结果集:
1 - Foo 2 - Foo 3 - Bar 4 - Foo
原始说明:
我有一个表,把它TABLE在那里我有一个两列说ID,并NAME共同构成表的主键。现在,我想选择某处,ID=1然后首先检查它是否可以找到NAME具有“ John”值的行,如果“ John”不存在,则应查找NAME“ Bruce”的行,而仅返回“ John”如果同时存在“布鲁斯”和“约翰”,或者仅存在“约翰”。
TABLE
ID
NAME
ID=1
还应注意,它应该能够为每个查询返回多行,这些行与上述条件匹配,但ID /名称组合当然不同,并且上述说明只是对实际问题的简化。
我可能对自己的代码和思路完全不了解,但我无法弄清楚。
这与您写的内容非常相似,但是应该相当快,因为在这种情况下,NOT EXISTS比NOT IN更有效…
mysql> select * from foo; +----+-----+ | id | col | +----+-----+ | 1 | Bar | | 1 | Foo | | 2 | Foo | | 3 | Bar | | 4 | Bar | | 4 | Foo | +----+-----+ SELECT id , col FROM foo f1 WHERE col = 'Foo' OR ( col = 'Bar' AND NOT EXISTS( SELECT * FROM foo f2 WHERE f1.id = f2.id AND f2.col = 'Foo' ) ); +----+-----+ | id | col | +----+-----+ | 1 | Foo | | 2 | Foo | | 3 | Bar | | 4 | Foo | +----+-----+