我在MySql中有两个表,一个是用户,第二个是用户 事务,事务通过user.id = transaction.user_id与用户相关 并非所有用户都有交易,每个用户的交易没有限制 所有交易都有added_date字段
我需要的是一个查询,它将为我提供所有用户的列表,其中包含有关其上次添加的交易(最后一笔交易)的已加入数据,如果他们没有任何交易,则为null;
所以我认为是
获取所有用户 在user.id = transaction.user_id上左连接事务 内部联接以获取按id
分组的max transaction.added_date类似的东西:
SELECT u.id,
u.name,
t.added_date
FROM `user` u
LEFT JOIN `transaction` t
ON u.id = t.user_id
INNER JOIN (
SELECT id,
MAX(added_date) AS addedDate
FROM `transaction`
GROUP BY id
)gt
ON t.id = gt.id AND t.added_date = gt.addedDate
但它没有给我我的预期,它留给用户的交易,但我仍然在结果集中为同一用户提供了许多交易
我做错了什么?
编辑:
我简化了一下,但这应该足够了:
用户
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(256) NOT NULL,
`email` varchar(128) NOT NULL,
`role_id` mediumint(8) unsigned NOT NULL,
`phone` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
交易
CREATE TABLE `transaction` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned DEFAULT NULL,
`added_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `fk_transaction_user1_idx` (`user_id`),
CONSTRAINT `transaction_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我需要一个包含最后一个交易数据的所有用户的列表,如果没有那么空的
答案 0 :(得分:0)
请试试这个
SELECT u.id,
u.name,
t.added_date
FROM `users` u
LEFT JOIN `transaction` t
ON u.id = t.user_id AND t.added_date = (
SELECT MAX( added_date )
FROM `transaction` t
WHERE t.user_id = u.id
)
答案 1 :(得分:0)
你的
SELECT user.name, MAX(transaction.added_date)
FROM user
LEFT JOIN transaction
ON user.id = transaction.user_id
GROUP BY user.name;
另外,尽量避免使用支持JOIN
s,because the subqueries usually not good on perfomance
UPD。 SQL Fiddle, with sorting ASC by date and NULLs last,使用COALESCE
UPD2。 Another SQL Fiddle with count