Записи заказа, если он находится в другой таблице - PullRequest
0 голосов
/ 04 октября 2018

У меня есть таблица contents.

+------------+------+----------+
| content_id | year | has_file |
+------------+------+----------+
| 1          | 2017 | true     |
| 2          | 2018 | true     |
| 3          | 2016 | true     |
| 4          | 2018 | true     |
| 5          | 2018 | false    |
+------------+------+----------+

Затем у меня есть таблица uploads.

+----+------------+------------+
| id | content_id | filename   |
+----+------------+------------+
| 1  | 2          | sample.jpg |
+----+------------+------------+

Я хочу получить данные в соответствии с последним годомсопровождаемый, если у него есть файл.

Я могу сделать это, используя запрос SELECT * FROM contents ORDER BY year DESC, has_file DESC.

Проблема не во всех записях с has_file, установленными на true, которые действительно записаны натаблица uploads.

Is может исключить все записи, которых нет в другой таблице, добавив 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     |
+------------+------+----------+

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы также можете использовать это,

SELECT 
    id, year, has_file
FROM
    (SELECT 
        c.id,
            c.year,
            c.has_file,
            CASE
                WHEN u.id IS NOT NULL THEN 1
                ELSE 2
            END AS flag
    FROM
        contents c
    LEFT JOIN uploads u ON (c.id = u.content_id)) tmp
ORDER BY flag , year DESC;
0 голосов
/ 04 октября 2018

Просто добавьте предложение 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

Вывод:

content_id  year    has_file
2           2018    true
4           2018    true
5           2018    false
1           2017    true
3           2016    true

SQLFiddle Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...