Mysql 根据唯一键之间的比较选择另一列的最新值

Mysql 根据唯一键之间的比较选择另一列的最新值,mysql,Mysql,我试图实现的是基于相同的msisdn(如果存在多个链接到其他imsi的msisdn)获取另一列的最新日期。(您可以假设imsi更像是一个唯一的列) (为了便于演示,简化了表格) 我有两张表,如下所示: 运算符表格 +--------+--------+---------------------+ | imsi | msisdn | last_accessed | +--------+--------+---------------------+ | 74583 | 004442

我试图实现的是基于相同的
msisdn
(如果存在多个链接到其他
imsi
msisdn
)获取另一列的最新日期。(您可以假设
imsi
更像是一个唯一的列)

(为了便于演示,简化了表格)

我有两张表,如下所示:

运算符表格

+--------+--------+---------------------+
|  imsi  | msisdn |    last_accessed    |
+--------+--------+---------------------+
| 74583  | 004442 | 2018-04-05 16:20:32 |
+--------+--------+---------------------+
| 94210  | 023945 | 2017-02-13 11:27:14 |
+--------+--------+---------------------+
| 59123  | 004442 | 2018-07-15 05:24:55 |
+--------+--------+---------------------+
| 61234  | 089923 | 2018-07-21 16:13:29 |
+--------+--------+---------------------+
+--------+--------------+---------------------+
|  imsi  |  company_id  |    business_plan    |
+--------+--------------+---------------------+
| 74583  |      FEX     |       yearly        |
+--------+--------------+---------------------+
| 94210  |      AOH     |       trial         |
+--------+--------------+---------------------+
| 59123  |      BIOI    |       monthly       |
+--------+--------------+---------------------+
| 61234  |      OOX     |       simple        |
+--------+--------------+---------------------+
客户表格

+--------+--------+---------------------+
|  imsi  | msisdn |    last_accessed    |
+--------+--------+---------------------+
| 74583  | 004442 | 2018-04-05 16:20:32 |
+--------+--------+---------------------+
| 94210  | 023945 | 2017-02-13 11:27:14 |
+--------+--------+---------------------+
| 59123  | 004442 | 2018-07-15 05:24:55 |
+--------+--------+---------------------+
| 61234  | 089923 | 2018-07-21 16:13:29 |
+--------+--------+---------------------+
+--------+--------------+---------------------+
|  imsi  |  company_id  |    business_plan    |
+--------+--------------+---------------------+
| 74583  |      FEX     |       yearly        |
+--------+--------------+---------------------+
| 94210  |      AOH     |       trial         |
+--------+--------------+---------------------+
| 59123  |      BIOI    |       monthly       |
+--------+--------------+---------------------+
| 61234  |      OOX     |       simple        |
+--------+--------------+---------------------+
以下是我的目标。如果我搜索
74583
,它应该返回
2018-07-15 05:24:55

+--------+--------------+---------------------+----------------------+
|  imsi  |  company_id  |    business_plan    |  last_accessed_date  |
+--------+--------------+---------------------+----------------------+
| 74583  |      FEX     |       yearly        |  2018-07-15 05:24:55 |
+--------+--------------+---------------------+----------------------+
下面的查询几乎返回我试图实现的结果,但根据上表,它不返回最新的日期

SELECT 
    cust.imsi,
    cust.company_id,
    cust.business_plan,
    CASE
      WHEN
      (
        SELECT MAX(subop.last_accessed)
          FROM operator subop
            WHERE subop.msisdn = op.msisdn
              GROUP BY subop.msisdn
                HAVING COUNT(*) > 1
      )
      THEN
        op.last_accessed
      ELSE
        'Never'
    END
      AS last_accessed_date
FROM customer cust 
  INNER JOIN operator op
    ON cust.imsi = op.imsi
WHERE cust.imsi = '74583';

此查询将返回每个imsi的上次访问日期:

select
  o1.imsi,
  o1.msisdn,
  max(o2.last_accessed) as last_accessed_date
from
  operator o1 inner join operator o2
  on o1.msisdn = o2.msisdn
group by
  o1.imsi,
  o1.msisdn
(我将operators表与其自身连接起来,以获取基于msisdn列的最后访问日期)。然后可以将此查询与customer表联接:

select
  c.imsi,
  c.company_id,
  c.business_plan,
  coalesce(l.last_accessed_date, 'Never') as last_accessed_date
from
  customer c left join (
    select
      o1.imsi,
      o1.msisdn,
      max(o2.last_accessed) as last_accessed_date
    from
      operator o1 inner join operator o2
      on o1.msisdn = o2.msisdn
    group by
      o1.imsi,
      o1.msisdn
  ) l on c.imsi = l.imsi
然后可以用不同的方式写,但我认为这更容易理解


请参见此处的小提琴

此查询将返回每个imsi的最后访问日期:

select
  o1.imsi,
  o1.msisdn,
  max(o2.last_accessed) as last_accessed_date
from
  operator o1 inner join operator o2
  on o1.msisdn = o2.msisdn
group by
  o1.imsi,
  o1.msisdn
(我将operators表与其自身连接起来,以获取基于msisdn列的最后访问日期)。然后可以将此查询与customer表联接:

select
  c.imsi,
  c.company_id,
  c.business_plan,
  coalesce(l.last_accessed_date, 'Never') as last_accessed_date
from
  customer c left join (
    select
      o1.imsi,
      o1.msisdn,
      max(o2.last_accessed) as last_accessed_date
    from
      operator o1 inner join operator o2
      on o1.msisdn = o2.msisdn
    group by
      o1.imsi,
      o1.msisdn
  ) l on c.imsi = l.imsi
然后可以用不同的方式写,但我认为这更容易理解


请在此处查看小提琴

我们可以尝试使用select子句中的相关子查询执行此操作:

SELECT
    c.imsi,
    c.company_id,
    c.business_plan,
    (SELECT MAX(t.last_accessed) FROM operator t
     WHERE t.msisdn = o.msisdn) last_accessed_date
FROM customer c
INNER JOIN operator o
    ON c.imsi = o.imsi
WHERE c.imsi = '74583';
请按照下面的链接观看SQLFiddle演示


我们可以尝试使用select子句中的相关子查询执行此操作:

SELECT
    c.imsi,
    c.company_id,
    c.business_plan,
    (SELECT MAX(t.last_accessed) FROM operator t
     WHERE t.msisdn = o.msisdn) last_accessed_date
FROM customer c
INNER JOIN operator o
    ON c.imsi = o.imsi
WHERE c.imsi = '74583';
请按照下面的链接观看SQLFiddle演示


试试这个

 SELECT 
      cust.imsi,
      cust.company_id,
      cust.business_plan, 
      ( 
      SELECT MAX(last_accessed) FROM operator AS a WHERE a.msisdn = op.msisdn 
      ) AS last_accessed_date 
FROM customer cust 
      INNER JOIN operator op 
      ON cust.imsi = op.imsi 
WHERE cust.imsi = '74583'

试试这个

 SELECT 
      cust.imsi,
      cust.company_id,
      cust.business_plan, 
      ( 
      SELECT MAX(last_accessed) FROM operator AS a WHERE a.msisdn = op.msisdn 
      ) AS last_accessed_date 
FROM customer cust 
      INNER JOIN operator op 
      ON cust.imsi = op.imsi 
WHERE cust.imsi = '74583'

按上次访问日期描述和限制1使用订单。74583只有一个数据。按上次访问日期描述和限制1使用订单。74583只有一个数据。谢谢,蒂姆。真棒的解释。看起来我不需要做大量的分组。我不相信结果会如此简短。Accepted@VolkanGüven fthiella给出的第二个查询可能比我所写的性能更好,至少对于大型数据集来说是这样,但它非常冗长。责怪MySQL没有分析函数,这在这里真的很有帮助。我使用的相关子查询通常不利于性能。但是它让我们可以写一个更简洁的查询。谢谢,蒂姆。真棒的解释。看起来我不需要做大量的分组。我不相信结果会如此简短。Accepted@VolkanGüven fthiella给出的第二个查询可能比我所写的性能更好,至少对于大型数据集来说是这样,但它非常冗长。责怪MySQL没有分析函数,这在这里真的很有帮助。我使用的相关子查询通常不利于性能。但是它让我们可以写一个更简洁的查询。谢谢你。令人惊叹的回答和令人惊讶的解释。不过,我会接受蒂姆的回答,因为它更有用、更直接:)谢谢。向上投票@沃尔康古文:是的,蒂姆的回答更简洁明了,我也会接受他的回答,谢谢!谢谢你,希拉。令人惊叹的回答和令人惊讶的解释。不过,我会接受蒂姆的回答,因为它更有用、更直接:)谢谢。向上投票@沃尔康古文:是的,蒂姆的回答更简洁明了,我也会接受他的回答,谢谢!