用于从子表获取最新值的MySQL查询

用于从子表获取最新值的MySQL查询,mysql,subquery,Mysql,Subquery,我有一张客户表和三张相关详细信息表 我想做的是获取客户的数据及其最新联系日期的相关行 我想从该查询中创建一个视图,并能够按操作员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_not

我有一张客户表和三张相关详细信息表

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

我想从该查询中创建一个视图,并能够按操作员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`)
    )
)

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

你想要的一切的核心是每个客户的最新联系日期/状态/说明。您可以使用聚合获取其中的每一项:

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;
第一个查询可以很容易地外部连接到客户机表以获取客户机信息,因为每个客户机应该只有一行。对于这些子查询中的最后两个,您必须连接回原始表(notes、status)以获得如下信息,因为行也必须按时间匹配:

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;
不过,我想发表一点意见。我看到您正在将运算符存储为列表。这破坏了正常化,通常是一个非常糟糕的主意。有关详细信息,请参阅


下面是我的查询示例。

向我们展示一些代码,然后我们可能会告诉您查询添加了什么错误。非常感谢您您的查询给了您什么您没有预料到的信息?另外,您是在查找最新日期的每个客户便笺,还是该日期的最新客户便笺?您比我快了几分钟:)我只是用子查询选择了最大值:)这是我的希望,这就是他试图做的xD GL!刚试过。没关系!我添加了一些字段,并在我的表上添加了名称。我想从中创建一个视图,但由于查询在from子句中有子查询,因此无法完成。你能给我推荐另一个选项吗?我通过创建许多视图,然后创建一个查询其他视图的全局视图来解决这个问题。