2015-02-06 93 views
3

我在嘗試合併DISTINCT & ORDER BY時遇到了問題。我有一個Users表具有以下屬性id, name &我有一個Purchases表具有以下屬性id,user_id,date_purchased,returnedSQL:在外部查詢中保留子查詢順序

我想檢索所有獨特Users有一個returnedPurchase通過date_purchased排序。

下面是一些樣本數據

Users 
id | name 
---+----------- 
1 | Bob 
2 | John 
3 | Bill 
4 | Frank 
5 | Fred 
6 | Al 

Purchases 
     id |  user_id  | startdate | returned 
    -----+------------------+------------+--------------- 
    100 | 1    | 2015-02-06 |   true 
    101 | 1    | 2015-01-06 |   true 
    102 | 1    | 2015-02-05 |   false 
    103 | 2    | 2015-02-05 |   false 
    104 | 2    | 2015-02-05 |   false 
    105 | 3    | 2015-01-05 |   true 
    106 | 3    | 2015-02-04 |   true 
    107 | 4    | 2015-01-07 |   true 
    108 | 5    | 2015-02-05 |   false 
    109 | 6    | 2015-02-07 |   false 
    110 | 6    | 2015-01-05 |   true 

結果應該是下面的用戶ID的1,3,4,6

這裏是我寫的

SELECT DISTINCT (id) FROM (
    SELECT users.id as id, purchases.startdate FROM 
    users INNER JOIN purchases on users.id=purchases.id 
    WHERE returned=true 
    ORDER BY startdate) 

該查詢正確返回結果的查詢;但是它的順序不正確。閱讀其他答案我發現你不能維護子查詢順序。我試圖將訂單移動到外部查詢;然而,startdate也需要存在於選擇查詢&這不是我想要

+0

目前還不清楚您的查詢有何意圖回答。每個購買都有一個'startdate',一個用戶可能會返回多個購買。通過*哪個*'startdate',那麼你是否想要命令結果? – 2015-02-06 20:28:12

回答

4

只是刪除子查詢和使用GROUP BY什麼:

SELECT u.id as id 
FROM users u INNER JOIN 
    purchases p 
    on u.id = p.id 
WHERE returned = true 
GROUP BY u.id 
ORDER BY MIN(startdate); 

只能依靠結果集在被當您使用ORDER BY作爲最外層SELECT時的特定順序。在任何其他情況下不能保證訂購。

作爲一個說明:排序通常可以與子查詢一起工作(可悲的是,因爲很多人看着一些查詢的結果並推廣到所有這些結果)。在這種情況下的問題是distinct。它重新排列數據(即排序)以刪除重複項。

0

Gordon的腳本爲您提供了您想要的數據,但要回答您如何維護子查詢的順序的問題,您可以通過子查詢和然後按的順序將您想要訂購的列拉出。

SELECT DISTINCT (id), innerTable.startdate FROM (
    SELECT users.id as id, purchases.startdate FROM 
    users INNER JOIN purchases on users.id=purchases.id 
    WHERE returned=true) as innerTable 
    ORDER BY innerTable.startdate 
+0

他們只需要不同的ID,而您的查詢拉動'id'和'startdate'的不同組合。 (將括號中的「id」括起來並不能告訴數據庫服務器你只需要'id'是不同的:'DISTINCT'總是應用於整行。) – 2015-02-19 20:15:26