新手问题。具有以下 MySQL 数据库/表结构:
CREATE DATABASE `dbTest`
CREATE TABLE IF NOT EXISTS `dbTest`.`tbUser` (
`UserId` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`Username` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`UserId`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `dbTest`.`tbTransactionType` (
`TypeId` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`Name` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`TypeId`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `dbTest`.`tbTransaction` (
`TransactionId` INT NOT NULL AUTO_INCREMENT ,
`UserId` INT UNSIGNED NOT NULL ,
`TransactionType` INT UNSIGNED NOT NULL ,
`Balance` DOUBLE NOT NULL ,
`Date` DATETIME NOT NULL ,
PRIMARY KEY (`TransactionId`) ,
INDEX `FK_tbTransaction_tbUser_UserId` (`UserId` ASC) ,
INDEX `FK_tbTransaction_tbTransactionType_TransactionId` (`TransactionType` ASC) ,
CONSTRAINT `FK_tbTransaction_tbUser_UserId`
FOREIGN KEY (`UserId` )
REFERENCES `dbTest`.`tbUser` (`UserId` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `FK_tbTransaction_tbTransactionType_TransactionId`
FOREIGN KEY (`TransactionType` )
REFERENCES `dbTest`.`tbTransactionType` (`TypeId` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
INSERT INTO `dbTest`.`tbUser` (`UserId`, `Username`) VALUES ('1', 'User1');
INSERT INTO `dbTest`.`tbTransactionType` (`TypeId`, `Name`) VALUES ('1', 'Deposite');
INSERT INTO `dbTest`.`tbTransactionType` (`TypeId`, `Name`) VALUES ('2', 'Withdraw');
INSERT INTO `dbTest`.`tbTransaction` (`TransactionId`, `UserId`, `TransactionType`, `Balance`, `Date`) VALUES (NULL, '1', '1', '200', NOW())
INSERT INTO `dbTest`.`tbTransaction` (`TransactionId`, `UserId`, `TransactionType`, `Balance`, `Date`) VALUES (NULL, '1', '2', '100', NOW())
INSERT INTO `dbTest`.`tbTransaction` (`TransactionId`, `UserId`, `TransactionType`, `Balance`, `Date`) VALUES (NULL, '1', '1', '20', NOW())
INSERT INTO `dbTest`.`tbTransaction` (`TransactionId`, `UserId`, `TransactionType`, `Balance`, `Date`) VALUES (NULL, '1', '2', '10', NOW())
我想获取 UserId 1 的每种交易类型的最后一个条目
这是我的 SQL 查询:
SELECT U.Username, TT.Name, T.Balance, T.Date
FROM tbUser U
INNER JOIN tbTransaction T ON T.UserId = U.UserId
INNER JOIN tbTransactionType TT ON TT.TypeId = T.TransactionType
WHERE U.UserId = 1
结果是:
Username Name Balance Date
User1 Deposite 200 2010-11-26 23:11:40
User1 Deposite 20 2010-11-26 23:14:56
User1 Withdraw 100 2010-11-26 23:11:58
User1 Withdraw 10 2010-11-26 23:14:56
当我想得到类似的东西时:
Username Name Balance Date
User1 Deposite 20 2010-11-26 23:14:56
User1 Withdraw 10 2010-11-26 23:14:56
我确定解决方案没有那么难,但我现在还想不通......
我也试过 GROUP BY TT.TypeId
但没有成功。
谢谢!
最佳答案
我认为这应该可以做到,如果您添加更多交易类型,这将不会成为问题。但是,我还没有完全测试过,因为我没有一个方便测试的“同构”(可能不是严格意义上的正确术语)表集。即使你解决了也请告诉我,我很好奇。
SELECT U.Username, TT.Name, T.Balance, T.Date
FROM tbUser U
INNER JOIN tbTransaction T ON T.UserId = U.UserId
INNER JOIN tbTransactionType TT ON TT.TypeId = T.TransactionType
WHERE U.UserId = 1 AND
T2.Date = (SELECT MAX(T2.date)
FROM tbTransaction T2 WHERE
T2.UserID = U.UserId, T2.TransactionType = T.TransactionType)
关于sql - MySQL多表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290139/