SQL:在外部查询中保留子查询顺序

时间:2015-02-06 20:23:36

标签: mysql sql postgresql psql

我在尝试合并DISTINCT& ORDER BY。我有一个Users表,其中包含以下属性id, name&我有一个Purchases表,其中包含以下属性id,user_id,date_purchased,returned

我想要检索Users returned排序Purchase的所有唯一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' s 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也需要出现在选择查询&这不是我想要的

2 个答案:

答案 0 :(得分:5)

只需删除子查询并使用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。它重新排列数据(即对其进行排序)以删除重复数据。

答案 1 :(得分: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