У меня есть эти 2 таблицы в базе данных MySQL:
CREATE TABLE transaction (
ID_TRANSACTION bigint(20) NOT NULL AUTO_INCREMENT,
IND_STATUS varchar(20) NOT NULL,
DAT_CREATION timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
DAT_UPDATE timestamp(3) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (IDT_TRANSACTION)
) ENGINE=InnoDB;
CREATE TABLE transaction_status_history (
ID_TRANSACTION_STATUS_HISTORY bigint(20) NOT NULL AUTO_INCREMENT,
ID_TRANSACTION bigint(20) NOT NULL,
IND_STATUS varchar(20) NOT NULL COMMENT '(New, Approved, Rejected, Error).',
DAT_CREATION timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (IDT_TRANSACTION_STATUS_HISTORY),
KEY transaction_transtathist_fk (IDT_TRANSACTION),
CONSTRAINT trans_fk FOREIGN KEY (IDT_TRANSACTION) REFERENCES transaction (IDT_TRANSACTION) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB;
По сути, в транзакции_статуса_history у меня будет одна или несколько записей для одного и того же ID_TRANSACTION.
Основываясь на этом простом запросе ниже, я хочу поставить некоторые условия для разных случаев:
Простой запрос:
Select IND_STATUS from transaction_status_history where idt_transaction = 12;
Если для этого запроса у меня есть строка с IND_STATUS = 'New' и еще одна строка с IND_STATUS = 'Approved', мой запрос должен вернуть ID_TRANSACTION_STATUS_HISTORY из строки с IND_STATUS = 'New'.
Если для этого запроса у меня есть строка с IND_STATUS = 'Rejected', а другая строка с IND_STATUS = 'New', мой запрос должен вернуть ID_TRANSACTION_STATUS_HISTORY из обеих записей.
Как я могу сделать эту логику в одном запросе?
Если вы оставили присоединение таблицы к себе, вы можете проверить наличие "Одобрено" IND_STATUS. Вы можете сделать еще несколько логических предположений, например, что мы всегда будем возвращать "Новую" запись, и мы всегда хотим вернуть "Отклонено", если она существует. Если у вас нет дополнительных бизнес-требований, о которых вы нам не сообщили, вы можете выполнить это с помощью этого запроса:
SELECT t.IND_STATUS
FROM transaction_status_history t
LEFT JOIN transaction_status_history t1 ON t.idt_transaction = t1.idt_transaction
AND t1.IND_STATUS = 'Approved'
WHERE
t.idt_transaction = 12
AND (
(t.IND_STATUS = 'New' AND ISNULL(t1.IND_STATUS,'Approved') = 'Approved')
OR t.IND_STATUS = 'Rejected'
)