在PostgreSQL中,表a
和b
是m:m关系—如何找到所有出现的字符串:
a.string
和b.string
列中b.string
的顺序,AND在a.string
中发生,然后在ab.id
中发生例如,"hello"
同时出现在a.string
和b.string
列中,并且按照b.string
的顺序在ab.id
中首先出现,因此"hello"
结果将返回。
类似的东西:
select *
from table ab
left join table a on (a.id = ab.a_id)
left join table b on (b.id = ab.b_id)
-- pseudo:
-- where b.string "hello" occurs first
-- and a.string "hello" also exists
order by ab.id
ab.id | ab.a_id | ab.b_id | a.string | b.string
-----------------------------------------------------
1 63 59 'good bye' > 'hello' -- appears first here
2 75 67 > 'hello' 'sounds good'
3 77 78 'have fun' 'awesome'
编辑:
基本上,该想法是用户应始终首先看到以a.string列的形式出现的字符串,然后是b.string。如果b.string实例首先出现,我们应该返回它。
我需要说明两种情况,其中不满足上述条件。
1) b.string
符合出现在a.string
之前的条件,但这不是a.string
的“ hello”的第一个实例-即,在第1行a.string
和b.string
是“ hello”,但随后第2行满足了b.string
的“ hello”出现在a.string
之前的条件:
ab.id | ab.a_id | ab.b_id | a.string | b.string
-----------------------------------------------------
1 63 59 'hello' > 'hello' -- meets condition
2 75 67 > 'hello' 'sounds good'
3 77 78 'have fun' 'awesome'
2) a.string
在b.string
为NULL时出现在其他位置,然后b.string
后面的任何其他行条件出现在a.string
之前应该为假
ab.id | ab.a_id | ab.b_id | a.string | b.string
-----------------------------------------------------
1 63 59 'hello' NULL
2 75 67 'good bye' 'hello'
3 77 78 'hello' 'awesome'
答案 0 :(得分:1)
您有两个条件。存在和不存在浮现在脑海:
select ab.*
from ab
where not exists (select 1
from ab ab2
where ab2.astring = ab.bstring and
ab2.id < ab.id
) and -- no earlier "a"s
exists (select 1
from ab ab2
where ab2.astring = ab.bstring
) -- another "a"