【问题标题】:mySQL Query - select join if latest record in join table contains a specific valuemySQL 查询 - 如果连接表中的最新记录包含特定值,则选择连接
【发布时间】:2014-01-02 14:27:27
【问题描述】:

我正在尝试编写一个带有右连接的选择语句(对客户端),它将在连接表中找到一个特定的值 - 但前提是这是每个客户端的最新值(忽略空白和空值)。

  Clients
  Id    Name
   0     John Doe
   1     Frank Smith
   2     Sue Smith
   3     John Smith


 Activity   (join table)
 ClientId  Type   Date
   0       500   2013-01-01 00:00:08
   1       900   2013-01-01 00:00:07
   2       NULL  2013-01-01 00:00:06
   3             2013-01-01 00:00:05
   4       500   2013-01-01 00:00:05
   0       800   2013-01-01 00:00:04
   1       500   2013-01-01 00:00:03
   2       500   2013-01-01 00:00:02
   3       500   2013-01-01 00:00:01
   4       800   2013-01-01 00:00:00

所以这个查询至少会给我活动类型为 500 的客户端记录(在这种情况下,我会返回客户端 0 和 4):

select * from clients right join activity on activity.clientid = clients.id 
where activity.type = 500

但是,我需要弄清楚如何让它只返回上述记录列表中的第一条记录。客户端 #0 的逻辑是唯一具有 500 作为其最新活动类型 = 500 的客户端。其他 3 个客户端具有 NULL、空白或 900 作为其“最新”活动类型。

我在想一些关于排序的魔法(日期通常会非常准确)、“顶部”和/或“限制”以及可能的联合?只是无法完全理解它。

【问题讨论】:

标签: mysql sql join


【解决方案1】:

请试试这个

SELECT activity.id AS activityid
    , activity.type
    , activity.date
    , clients.id AS clientid
    , clients.name
FROM activity
LEFT JOIN activity AS other_activities
  ON activity.ClientID  = other_activities.ClientID
    AND activity.date < other_activities.date
LEFT JOIN clients
  ON activity.ClientID = clients.id
WHERE activity.type = 500
  AND other_activities.ClientID IS NULL;

【讨论】:

  • 这似乎有效,但我发现我还需要考虑“空白”或“NULL”值。因此,例如,如果客户有一个空白活动值,然后是“500”,我不想计算空白。
  • 知道了,我刚刚在左连接活动中添加了第二个条件:“AND other_activities.type > 0”(它实际上是我的数据库中的数字)!谢谢!
【解决方案2】:
SELECT * from Activity 
INNER JOIN (SELECT MIN(Date) as min_date, clientID 
    FROM Activity 
    GROUP BY clientID) temp 
ON Activity.clientID = temp.clientID 
WHERE date = min_date and type = 500

这将返回最近活动类型为 500 的所有客户端 ID。

【讨论】:

  • 这个似乎不起作用。至少应该有不在结果列表中的记录。
【解决方案3】:

这将为您提供类型为 500 的最新活动以及该活动的客户端

SELECT * FROM
    (SELECT *
     FROM activity
     WHERE type=500
     ORDER BY date DESC
     LIMIT 1) a
LEFT JOIN
     clients c
ON (a.clientid = c.id)

如果你只想要结果,如果它是最近的活动并且类型是 500,你可以使用

SELECT * FROM
    (SELECT *
     FROM activity
     ORDER BY date DESC
     LIMIT 1) a
LEFT JOIN
     clients c
ON (a.clientid = c.id)
WHERE a.type = 500;

sqlFiddle here 获取最新活动类型为 500 的客户

SELECT a1.ClientID,c.name,a1.Type,a1.Date
FROM activity a1
LEFT JOIN clients c ON (c.id = a1.clientid)
WHERE NOT EXISTS (SELECT 1
                  FROM activity a
                  WHERE a.clientid = a1.clientid
                    and a.date > a1.date)
AND a1.type = 500;

【讨论】:

  • 顶部查询似乎只返回 1 个客户端。类型逻辑似乎是正确的,但它是限制 1 和左连接,所以你只能得到 1 条记录。我需要所有最近有 500 类型活动的客户。
  • 尝试我的答案的最底层查询,它会给您提供最新活动类型为 500 的客户
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多