Управлять результатами моего запроса в соответствии с некоторыми условиями

0

У меня есть эти 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 из обеих записей.

Как я могу сделать эту логику в одном запросе?

Теги:

1 ответ

0

Если вы оставили присоединение таблицы к себе, вы можете проверить наличие "Одобрено" 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'
    )
  • 0
    работал, спасибо !!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню