2015-07-21 66 views
1

我有一张客户表和三张相关详细信息表,如Fiddle所示。MySQL查询从子表中获取最新值

我想要做的是获取客户的数据及其相关行最新联系日期。

我想从该查询创建一个视图,并能够按操作员ID进行过滤。我总是得到错误的行数到我所期望的。

以下是我的查询,有人可以帮我找出为什么它返回不正确的结果?

select c.*,cs.client_status,cn.client_note,cd.contact_date from clienti c 
left join client_status cs on c.id = cs.client 
left join client_notes cn on c.id = cn.client 
left join client_contact_date cd on c.id = cd.client 
where 
(
    (
     `cd`.`contact_date` = (select max(`client_contact_date`.`contact_date`) from `client_contact_date` where `client_contact_date`.`client` = `c`.`id`) 
    ) 
    AND 
    (
     `cn`.`mod_time` = (select max(`client_notes`.`mod_time`) from `client_notes` where `client_notes`.`client` = `c`.`id`) 
    ) 
    AND 
    (
     `cs`.`mod_time` = (select max(`client_status`.`mod_time`) from `client_status` where `client_status`.`client` = `c`.`id`) 
    ) 
) 
+0

向我们展示您的一些代码,然后我们可能会告诉您出了什么问题 – Osuwariboy

+0

已添加查询。非常感谢你 – Aptivus

+0

你的查询给你什么,你没有预料到? – AdamMc331

回答

2

我建议你把它分成小块,然后开始把连接放在一起。

所有你想要的内容都是每个客户端的最新contact_date/status/note。你可以得到每个那些使用聚合:

SELECT client, MAX(contact_date) AS latestContact 
FROM client_contact_date 
GROUP BY client; 

SELECT client, MAX(mod_time) AS latestNote 
FROM client_notes 
GROUP BY client; 

SELECT client, MAX(mod_time) AS latestStatus 
FROM client_status 
GROUP BY client; 

第一个查询很容易被外部联接到客户表以获得客户信息,因为有只应为每个客户一行。在过去两年的子查询,你就必须加入回到原来的表(笔记,状态)来获取这样的信息,因为该行必须用时间,以及匹配:一旦

SELECT n.client, n.client_note, n.mod_time 
FROM client_notes n 
JOIN(
    SELECT client, MAX(mod_time) AS latestNote 
    FROM client_notes 
    GROUP BY client) t ON t.client = n.client AND t.latestNote = n.mod_time; 

SELECT s.client, s.client_status, s.mod_time 
FROM client_status s 
JOIN(
    SELECT client, MAX(mod_time) AS latestStatus 
    FROM client_status 
    GROUP BY client) t ON t.client = s.client AND t.latestStatus = s.mod_time; 

你把所有的这些东西,你可以使用外部联接带来最新的信息一起行:

SELECT c.id, c.clientName, c.operators, cd.latestContact, cn.client_note, cn.latestNote, cs.client_status, cs.latestStatus 
FROM clienti c 
LEFT JOIN(
    SELECT client, MAX(contact_date) AS latestContact 
    FROM client_contact_date 
    GROUP BY client) cd ON cd.client = c.id 
LEFT JOIN(
    SELECT n.client, n.client_note, n.mod_time AS latestNote 
    FROM client_notes n 
    JOIN(
    SELECT client, MAX(mod_time) AS latestNote 
    FROM client_notes 
    GROUP BY client) t ON t.client = n.client AND t.latestNote = n.mod_time) cn ON cn.client = c.id 
LEFT JOIN(
    SELECT s.client, s.client_status, s.mod_time AS latestStatus 
    FROM client_status s 
    JOIN(
    SELECT client, MAX(mod_time) AS latestStatus 
    FROM client_status 
    GROUP BY client) t ON t.client = s.client AND t.latestStatus = s.mod_time) cs ON cs.client = c.id; 

我想提出一个意见,但。我看到您将运营商存储为列表。这打破了正常化,通常是一个非常糟糕的主意。有关我的信息,请参阅Is storing a delimited list in a database column really that bad?

以下是我的查询的示例SQL Fiddle

+1

你打我几分钟:)我只是选择最大值与子查询:)这里是我的[小提琴](http://sqlfiddle.com/#!9/3b07c/17)希望这是他正在试图做的xD GL! –

+0

@ McAdam331谢谢你,我会去尝试你的查询 – Aptivus

+0

@Aptivus做到了吗?刚刚尝试过 – AdamMc331