在结果上使用左连接和内连接的MySql查询

时间:2014-02-06 09:23:01

标签: mysql sql join

我在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;

我需要一个包含最后一个交易数据的所有用户的列表,如果没有那么空的

2 个答案:

答案 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;

Here is SQL Fiddle

另外,尽量避免使用支持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