PostgreSQL按不同表中的多列排序

时间:2018-08-09 14:31:10

标签: sql postgresql sql-order-by union

我有下表:

来源:

**id  | name**

 1      source1

 2      source2

 3      source3

 4      source4

项目:

**id | name | sourceId | created_at**

1    item3      3      2018-08-09 07:28:17

2    item2      2      2018-08-09 07:30:00

sql:

SELECT
    sources.id,
    sources.name
FROM
     sources
LEFT JOIN
     items
         ON items.sourceId = sources.id
ORDER BY items.created_at DESC, sources.id

期望:

**id  | name**

2      source2

3      source3

1      source1

4      source4

说明:

我需要一个结果,其中包含源表中的所有源,但按最近使用过的源(分配给项的源)进行排序。以某种方式,第一个结果是源表中的结果,然后按desc顺序可以可以在项目表中找到,如下所示:

实际结果:

**id  | name**

1      source1 

4      source4

2      source2

3      source3

我通过第二个SQL设法获得了期望的结果,但是我认为我的第一次尝试也有解决方案:

(SELECT
    sources.id,
    sources.name
FROM
     sources
INNER JOIN
     items
         ON items.sourceId = sources.id
ORDER BY items.created_at DESC, sources.id)
UNION ALL
(SELECT
       sources.id,
       sources.name
FROM
     sources
LEFT JOIN
    items
ON items.sourceId = sources.id
WHERE items.sourceId IS NULL)

上述sql的另一个问题是,我不太了解为什么在使用UNION时订单混乱,但是在使用UNION ALL时订单正确。据我所知,唯一的区别是UNION消除了重复项,而UNION ALL却没有

1 个答案:

答案 0 :(得分:2)

如果我做对了,NULLS LAST可能会解决问题。 ... 在DESC处按ORDER BY items.created_at                           NULLS LAST,          sources.id;