2017-07-27 97 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; 
相關問題