订单记录,如果它在另一个表中

Dav*_*ulo 1 mysql sql

我有一张contents桌子.

+------------+------+----------+
| content_id | year | has_file |
+------------+------+----------+
| 1          | 2017 | true     |
| 2          | 2018 | true     |
| 3          | 2016 | true     |
| 4          | 2018 | true     |
| 5          | 2018 | false    |
+------------+------+----------+
Run Code Online (Sandbox Code Playgroud)

然后我有uploads桌子.

+----+------------+------------+
| id | content_id | filename   |
+----+------------+------------+
| 1  | 2          | sample.jpg |
+----+------------+------------+
Run Code Online (Sandbox Code Playgroud)

我想根据最近一年获取数据,然后是否有文件.

我可以使用查询来做到这一点SELECT * FROM contents ORDER BY year DESC, has_file DESC.

问题不是所有has_file设置为的true记录实际记录在uploads表上.

是否可以通过添加排除其他表上不存在的所有记录WHERE EXISTS (SELECT 1 FROM uploads WHERE uploads.content_id = contents.content_id).

但是我不想排除它,我只是希望它出现在最后,并且带有文件的记录首先出现.这可能吗?

预期结果:

+------------+------+----------+
| content_id | year | has_file |
+------------+------+----------+
| 2          | 2018 | true     |
| 4          | 2018 | true     |
| 5          | 2018 | false    |
| 1          | 2017 | true     |
| 3          | 2016 | true     |
+------------+------+----------+
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 7

只需将EXISTS子句添加到ORDER BY查询的子句中:

SELECT * 
FROM contents 
ORDER BY year DESC, 
         has_file DESC, 
         EXISTS (SELECT 1 FROM uploads WHERE uploads.content_id = contents.content_id) DESC
Run Code Online (Sandbox Code Playgroud)

输出:

content_id  year    has_file
2           2018    true
4           2018    true
5           2018    false
1           2017    true
3           2016    true
Run Code Online (Sandbox Code Playgroud)

SQLFiddle演示