mysql选择包含最高值的记录,连接包含空值的列范围

时间:2012-07-31 09:18:58

标签: mysql join distinct

以下是我正在使用的内容:

CREATE TABLE IF NOT EXISTS `rate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `client_company` int(11) DEFAULT NULL,
  `client_group` int(11) DEFAULT NULL,
  `client_contact` int(11) DEFAULT NULL,
  `role` int(11) DEFAULT NULL,
  `date_from` datetime DEFAULT NULL,
  `hourly_rate` decimal(18,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `rate` (`id`, `client_company`, `client_group`, 
                    `client_contact`, `role`, `date_from`, `hourly_rate`) 
VALUES
(4, NULL, NULL, NULL, 3, '2012-07-30 14:48:16', 115.00),
(5, 3, NULL, NULL, 3, '2012-07-30 14:51:38', 110.00),
(6, 3, NULL, NULL, 3, '2012-07-30 14:59:20', 112.00);

此表存储客户的退款率;我们的想法是,在寻找工作角色的正确率时,我们首先要查找与给定角色和客户联系人匹配的费率,如果没有找到费率,则会尝试匹配角色和客户端组(或“部门”),然后是客户公司,最后只为角色本身寻找全球费率。细

费率可能会随着时间的推移而变化,因此该表可能包含与角色,公司,群组和客户联系人的任何给定组合相匹配的多个条目:我想要一个只返回每个不同组合的最新查询的查询。

考虑到I asked a near-identical question only days ago,并且这个主题在各种伪装中似乎相当频繁,我只能为我的迟钝道歉而再次请求某人解释为什么下面的查询返回所有三个记录以上而不是我想要的,只有ID为4和6的记录。

是否与我尝试基于包含NULL的列进行连接有关?

SELECT
    rate.*,
    newest.id
FROM rate
    LEFT JOIN rate AS newest ON(
        rate.client_company = newest.client_company
        AND rate.client_contact = newest.client_contact
        AND rate.client_group = newest.client_group
        AND rate.role= newest.role
        AND newest.date_from > rate.date_from
    )
WHERE newest.id IS NULL

1 个答案:

答案 0 :(得分:0)

FWIW,WAS加入NULL列的问题。重要的缺失成分是COALESCE:

SELECT
    rate.*,
    newest.id
FROM rate
    LEFT JOIN rate AS newest ON(
        COALESCE(rate.client_company,1) = COALESCE(newest.client_company,1)
        AND COALESCE(rate.client_contact,1) = COALESCE(newest.client_contact,1)
        AND COALESCE(rate.client_group,1) = COALESCE(newest.client_group,1)
        AND COALESCE(rate.role,1) = COALESCE(newest.role,1)
        AND newest.date_from > rate.date_from
    )
WHERE newest.id IS NULL