我建议你把它分成小块,然后开始把连接放在一起。
所有你想要的内容都是每个客户端的最新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。
向我们展示您的一些代码,然后我们可能会告诉您出了什么问题 – Osuwariboy
已添加查询。非常感谢你 – Aptivus
你的查询给你什么,你没有预料到? – AdamMc331