Как получить соответствующее ПОЛЕ MAX (DATE) в MySQL? - PullRequest
0 голосов
/ 26 ноября 2018

Мои две таблицы следующие:

Table 1 : Transaction
TRANS_ID (primary key), TRANS_DATE, TRANS_STATUS, USER_ID (Foreign_Key) 

Тот же идентификатор_пользователя будет повторяться при изменении статуса

Table 2 : Users
USER_ID (Primary_Key), USER_NAME, USER_DOB, OTHER_INFO

Я хочу получить информацию о пользователе вместе с состоянием последней транзакции.

Мне знаком следующий запрос.

SELECT MAX(Transaction.TRANS_DATE),Transaction.TRANS_STATUS, Users.USER_NAME, Users.USER_DOB
FROM Users
INNER_JOIN Transaction ON Transaction.USER_ID = Users.USER_ID 
WHERE Transaction.USER_ID = @UserID    

Я передаю UserID с Parameter.AddWithValue.К сожалению, этот метод не возвращает TRANS_STATUS для MAX(TRANS_DATE).Он возвращает MAX(TRANS_DATE), но TRANS_STATUS - это первое вхождение, а не соответствующая запись STATUS - MAX(TRANS_DATE).

Пожалуйста, дайте мне знать, как я могу получить TRANS_STATUS для MAX(TRANS_DATE),Я предпочитаю использовать INNER JOIN, но рекомендации приветствуются.

Я все еще не мог приступить к работе.

Вот мои скрипты таблиц.

CREATE TABLE `Transactions` (
  `TRANS_ID` int(11) NOT NULL,
  `TRANS_DATE` datetime NOT NULL,
  `TRANS_STATUS` varchar(45) NOT NULL,
  `USER_ID` int(11) NOT NULL,
  PRIMARY KEY (`TRANS_ID`),
  UNIQUE KEY `TRANS_ID_UNIQUE` (`TRANS_ID`),
  KEY `USER_ID_idx` (`USER_ID`),
  CONSTRAINT `USER_ID` FOREIGN KEY (`USER_ID`) REFERENCES `Users` (`USER_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `Users` (
  `USER_ID` int(11) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(45) NOT NULL,
  `USER_DOB` datetime NOT NULL,
  `OTHER_INFO` varchar(45) NOT NULL,
  PRIMARY KEY (`USER_ID`),
  UNIQUE KEY `USER_ID_UNIQUE` (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

Вы можете использовать функцию LAST_VALUE

SELECT Top 1 
      u.User_ID
     ,u.user_name
     ,u.user_dob
     ,u.other_info
    ,LAST_VALUE(t.Trans_Date) OVER (PARTITION BY t.user_id ORDER BY 
              t.Trans_Date RANGE BETWEEN UNBOUNDED PRECEDING AND
            UNBOUNDED FOLLOWING) AS Max_Tran_Date
    ,LAST_VALUE(t.trans_status) OVER (PARTITION BY t.user_id ORDER BY 
              t.Trans_Date RANGE BETWEEN UNBOUNDED PRECEDING AND
            UNBOUNDED FOLLOWING) as Last_Status
FROM #Users as u
INNER JOIN #Transaction as t ON t.user_id = u.user_id
WHERE u.User_ID = @UserID
0 голосов
/ 26 ноября 2018

Если я правильно понял, это может сработать для вас

SELECT A.USER_ID AS USER_ID, A.TRANS_DATE AS TRANS_DATE, TRANS_STATUS, USER_NAME, USER_DOB
FROM
(SELECT USER_ID, MAX(TRANS_DATE) AS TRANS_DATE FROM TRANSACTION
GROUP BY USER_ID) A
INNER JOIN
(SELECT USER_ID, TRANS_DATE, TRANS_STATUS FROM TRANSACTION) B
ON A.USER_ID = B.USER_ID
AND A.TRANS_DATE=B.TRANS_DATE
INNER JOIN USERS U
ON A.USER_ID=U.USER_ID;
0 голосов
/ 26 ноября 2018
SELECT Users.USER_NAME, Users.USER_DOB
FROM Users usr INNER JOIN(
    SELECT Transaction.TRANS_STATUS, MAX(Transaction.TRANS_DATE)
    FROM Transaction GROUP BY Transaction.TRANS_STATUS) trs ON trs.USER_ID=usr.USER_ID
0 голосов
/ 26 ноября 2018

Вы можете использовать соединение в подзапросе для max TRANS_DATE

    select t.max_trans, t.USER_NAME, t.USER_DOB
    from Transaction 
    INNER JOIN 
    (
        SELECT MAX(Transaction.TRANS_DATE) max_trans, 
             Transaction.USER_ID, Users.USER_NAME, Users.USER_DOB
        FROM Users
        INNER_JOIN Transaction ON Transaction.USER_ID = Users.USER_ID 
        WHERE Transaction.USER_ID = @UserID
    ) t on Transaction.USER_ID = t.USER_ID and t.max_trans = Transaction.TRANS_DATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...