У меня есть таблица с этими 6 строками.
code | type_id | status | type
-----+--------+--------+-------
123 | 123456 | UPLOAD | PDF
123 | 456789 | UPLOAD | DOC
321 | 654321 | UPLOAD | PDF
321 | 897321 | DONE | DOC
456 | 999888 | PEND | PDF
456 | 777666 | UPLOAD | DOC
И я хочу получить результат, как показано ниже, с помощью
Case1 получить type_id с UPLOAD UPLOAD под тем же кодом для PDF и doc
Case2 получить type_id с UPLOAD только с UPLOAD DONE под тем же кодом для PDF и doc
Case3 не показывать type_id при PEND и сбое под одним и тем же кодом для PDF и doc
code | type_id1 | type_id2
-----+----------+---------
123 | 123456 | 456789
321 | 654321 | null
null | null | null <for 456 dont show result
Как я могу обработать их с помощью sql, чтобы показать результат?
Большое спасибо ~
1 ответ
Вы можете добиться этого, LEFT JOIN
-соединив таблицу с самой собой:
SELECT t1.code, t1.type_id AS type_id1, t2.type_id AS type_id2
FROM your_table t1
LEFT JOIN your_table t2
ON t1.code = t2.code
AND t2.type = 'DOC'
AND t2.status = 'UPLOAD'
WHERE t1.type = 'PDF' AND t1.status = 'UPLOAD'
Это возьмет все строки с PDF
и UPLOAD
и "добавит" значение type_id2
, только если есть строка с соответствующими code
, type = DOC
и status = UPLOAD
Для данных, которые вы предоставили, ожидаемый результат должен быть
code | type_id1 | type_id2
-----+----------+---------
123 | 123456 | 456789
321 | 654321 | null
Вы можете попробовать здесь
=== Версия 2 ============================================ ==================
Вот обновленная версия, основанная на моей интерпретации ваших комментариев:
SELECT t1.code,
CASE
WHEN t1.status = 'UPLOAD' AND t2.status != 'PEND'
THEN t1.type_id
ELSE null
END AS type_id1,
CASE
WHEN t2.status = 'UPLOAD' AND t1.status != 'PEND'
THEN t2.type_id
ELSE null
END AS type_id2
FROM your_table t1
LEFT JOIN your_table t2
ON t1.code = t2.code
AND t2.type = 'DOC'
WHERE t1.type = 'PDF'
Вы можете попробовать это здесь
Если вам не нужны строки с code | null | null
, вы можете удалить оба AND t#.status != 'PEND'
из предложений WHEN
и добавить в самом конце запроса: AND t1.status != 'PEND' AND t2.status != 'PEND'
, например второй запрос в скрипке.
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.
456 | null | null
?