SQL内部联接仅与第二个表中的最后一行

时间:2019-06-06 11:01:15

标签: sql

我有两个表:leadstracking_leads。 表结构如下,

----------------------------            ----------------------
|    leads                 |            |  tracking_leads     |
----------------------------            ----------------------
| id                       |            |  tracking_id        |
| lead_id                  |            |  lead_id            |
| anzahl_tickets           |            |  field_name         |
| bearbeitungs_id_einkauf  |            |  date               |
----------------------------            -----------------------

我需要sql来连接带有track_leads表的表导联,但是仅获得表trace_leads中的最后一个匹配行。

Sql示例:

 SELECT DATE_FORMAT(tracking_leads.date, "%d.%m.%Y") as trackDate, SUM(l.anzahl_tickets)
 as sumValue FROM leads as l INNER JOIN tracking_leads ON l.lead_id=tracking_leads.lead_id 
 WHERE  bearbeitungs_id_einkauf <> '' AND  tracking_leads.field_name='bearbeitungs_id_einkauf' 
 GROUP BY DATE_FORMAT(tracking_leads.date, "%d.%m.%Y")

在这一部分中:INNER JOIN tracking_leads ON l.lead_id=tracking_leads.lead_id仅需要tracking_leads表中的最后一条记录。

例如,潜在客户数据:

id lead_id anzahl_tickets bearbeitungs_id_einkauf 1 20 2 100

tracking_leads数据:

tracking_id lead_id field_name date 1 20 bearbeitungs_id_einkauf 2019-05-31 13:55 2 20 bearbeitungs_id_einkauf 2019-05-31 15:00

结果我需要得到:

2019-05-31 2

但是现在我得到了

2019-05-31 4

因为存在重复的lead_id(仅需要最后一条记录)。

我该如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

首先,我不喜欢日期格式DD-MM-YYYY,因为您无法对其进行排序。只需使用YYYY-MM-DD。

第二,您可以使用相关子查询来获取最新日期:

SELECT DATE(tl.date) as trackDate, SUM(l.anzahl_tickets) as sumValue
FROM leads l INNER JOIN
     tracking_leads tl
     ON l.lead_id = tl.lead_id
WHERE l.bearbeitungs_id_einkauf <> '' AND
      tl.field_name = 'bearbeitungs_id_einkauf' AND
      tl.date = (SELECT MAX(tl2.date)
                 FROM tracking_leads tl2
                 WHERE tl2.lead_id = tl.lead_id AND
                       tl2.field_name = tl.field_name
                )
GROUP BY DATE(tl.date);

当然,您可以根据需要保留原始日期格式。如果这样做,则可以使用:

ORDER BY MIN(tl.date)

所以结果按日期排序。

答案 1 :(得分:0)

我的偏好是使用嵌入式视图来获取最大日期。 关联的子查询每行将执行一次,而内联视图则只需执行一次。

这应该有效:

SELECT DATE_FORMAT(tl.date, "%d.%m.%Y") as trackDate,
       SUM(l.anzahl_tickets) as sumValue
  FROM leads as l 
 INNER JOIN (
         select x.lead_id, max(x.date) date from tracking_leads x where x.field_name = 'bearbeitungs_id_einkauf' group by x.lead_id
       ) tl ON l.lead_id=tl.lead_id 
 WHERE bearbeitungs_id_einkauf <> ''
 GROUP BY DATE_FORMAT(tl.date, "%d.%m.%Y")

侧节点:WHERE子句中对 bearbeitungs_id_einkauf 的空值的测试是特定于数据库的,因此请注意那里的问题。例如,在Oracle中,没有空字符串之类的东西,因此您必须对其进行测试,使其不为空。我假设这不是Oracle。