2017-07-27 98 views
0

我试图选择user_from存在的行作为user_to在以后创建的其他行中。为每个组合选择第一行

此查询为我提供了行。

SELECT A 
FROM db.table A 
LEFT JOIN db.table B 
ON A.user_to = B.user_from 
AND A.user_from = B.user_to 
AND A.createdAt < B.createdAt 
WHERE B.user_to IS NOT NULL AND B.user_from IS NOT NULL; 

但是,我想得到每个组合user_to/user_from的第一行。

E.g.如果有喜欢的一些行:

user_to = 1, user_from = 2 
user_to = 2, user_from = 1 
user_to = 2, user_from = 1 
user_to = 1, user_from = 2 

我想只是第一个创建(如createdAt定义)。

我试过使用GROUP BY user_from,但是这排除了每个user_from的所有其他组合。

+0

请使用'DISTINCT'来选择列值 –

回答

0

看来我早些时候误解了这个要求。

假设没有两个“createdAt的价值观是完全一样的,你可以这样做:

 select a.* from 
     A a 
     where NOT EXISTS (SELECT * 
          FROM A b 
          WHERE (
           (
           (a.to_ = b.from_ AND a.from_ = b.to_) 
           OR 
           (a.to_ = b.to_ AND a.from_ = b.from_ AND a.c <> b.c) 
          ) 
         AND 
         b.c < a.c 
         ) 
        ); 
+0

在这种情况下,您需要在A和B上都选择min? –

+0

我觉得A应该够了,因为OP只需要一条记录。 – dev8080

+0

@Manolo我认为它可能工作,如果select子句包括A表的createdAt(星,A星或包括它的列表)。 – dev8080

0

我认为使用DISTINCTSELECT查询。

SELECT DISTINCT A 
FROM db.table A 
LEFT JOIN db.table B 
ON A.user_to = B.user_from 
AND A.user_from = B.user_to 
AND A.createdAt < B.createdAt 
WHERE B.user_to IS NOT NULL AND B.user_from IS NOT NULL; 
相关问题