我在尝试合并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
也需要出现在选择查询&这不是我想要的
答案 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