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没有分析函数,这在这里真的很有帮助。我使用的相关子查询通常不利于性能。但是它让我们可以写一个更简洁的查询。谢谢你。令人惊叹的回答和令人惊讶的解释。不过,我会接受蒂姆的回答,因为它更有用、更直接:)谢谢。向上投票@沃尔康古文:是的,蒂姆的回答更简洁明了,我也会接受他的回答,谢谢!谢谢你,希拉。令人惊叹的回答和令人惊讶的解释。不过,我会接受蒂姆的回答,因为它更有用、更直接:)谢谢。向上投票@沃尔康古文:是的,蒂姆的回答更简洁明了,我也会接受他的回答,谢谢!