MySQL sorting/grouping 内部 JOIN
MySQL sorting/grouping inside JOIN
你好有以下架构
-- Accounts ----
[id] name
----------------
20 BigCompany
25 SomePerson
-- Followers -------
[id follower_id]
--------------------
20 25
-- Daily Metrics --------------------------------
[id date ] follower_count media_count
-------------------------------------------------
25 2015-10-07 350 24
25 2015-10-13 500 27
25 2015-10-12 480 26
我想要一个特定帐户的所有关注者的列表,返回他们的最新信息follower_count
。我试过 JOIN、相关子查询等,但 none 对我有用。
BigCompany
关注者的预期结果:
id username follower_count media_count 'last_checked'
---------------------------------------------------------------
25 SomePerson 500 27 2015-10-13
试试这个:
SELECT DISTINCT
a.id,
a.name AS username,
d.media_count,
d.date AS last_checked
FROM Accounts AS a
INNER JOIN Followers AS f ON a.id = f.follower_id
INNER JOIN DailyMetrics AS d ON d.id = f.follower_id
INNER JOIN
(
SELECT id, MAX(date) AS MaxDate
FROM DailyMetrics
GROUP BY id
) AS dm ON d.date = dm.maxdate
WHERE f.id = 999 ;
子查询:
SELECT id, MAX(date) AS MaxDate
FROM DailyMetrics
GROUP BY id
将获取每个 id
的最新日期,然后 JOIN
将其与 table DailyMetrics
相结合将消除除具有最多的行之外的所有行最近日期。
这会给你:
| id | name | media_count | date |
|----|------------|-------------|---------------------------|
| 25 | SomePerson | 27 | October, 13 2015 00:00:00 |
做一些 JOIN
,使用 NOT EXISTS
排除旧指标:
select a1.id, a1.name, dm.follower_count, dm.media_count, dm.date as "last_checked"
from Accounts a1
join Followers f on f.follower_id = a1.id
join Accounts a2 on f.id = a2.id
join DailyMetrics dm on dm.id = a1.id
where a2.name = 'BigCompany'
and not exists (select 1 from DailyMetrics
where id = dm.id
and date > dm.date)
With Id_max as
(Select id, max(date) As MaxDate
From DailyMetrics
Group By id)
Select
a.id,
a.name As username,
d.follower_count As MediaCount,
d.date As last_checked
From Accounts As a
join Followers As f ON a.id = f.follower_id
join DailyMetrics As d ON d.id = f.follower_id
join id_max on id_max.id=a.id and MaxDate=date
Where f.id = "WhatYouWant"
你好有以下架构
-- Accounts ----
[id] name
----------------
20 BigCompany
25 SomePerson
-- Followers -------
[id follower_id]
--------------------
20 25
-- Daily Metrics --------------------------------
[id date ] follower_count media_count
-------------------------------------------------
25 2015-10-07 350 24
25 2015-10-13 500 27
25 2015-10-12 480 26
我想要一个特定帐户的所有关注者的列表,返回他们的最新信息follower_count
。我试过 JOIN、相关子查询等,但 none 对我有用。
BigCompany
关注者的预期结果:
id username follower_count media_count 'last_checked'
---------------------------------------------------------------
25 SomePerson 500 27 2015-10-13
试试这个:
SELECT DISTINCT
a.id,
a.name AS username,
d.media_count,
d.date AS last_checked
FROM Accounts AS a
INNER JOIN Followers AS f ON a.id = f.follower_id
INNER JOIN DailyMetrics AS d ON d.id = f.follower_id
INNER JOIN
(
SELECT id, MAX(date) AS MaxDate
FROM DailyMetrics
GROUP BY id
) AS dm ON d.date = dm.maxdate
WHERE f.id = 999 ;
子查询:
SELECT id, MAX(date) AS MaxDate
FROM DailyMetrics
GROUP BY id
将获取每个 id
的最新日期,然后 JOIN
将其与 table DailyMetrics
相结合将消除除具有最多的行之外的所有行最近日期。
这会给你:
| id | name | media_count | date |
|----|------------|-------------|---------------------------|
| 25 | SomePerson | 27 | October, 13 2015 00:00:00 |
做一些 JOIN
,使用 NOT EXISTS
排除旧指标:
select a1.id, a1.name, dm.follower_count, dm.media_count, dm.date as "last_checked"
from Accounts a1
join Followers f on f.follower_id = a1.id
join Accounts a2 on f.id = a2.id
join DailyMetrics dm on dm.id = a1.id
where a2.name = 'BigCompany'
and not exists (select 1 from DailyMetrics
where id = dm.id
and date > dm.date)
With Id_max as
(Select id, max(date) As MaxDate
From DailyMetrics
Group By id)
Select
a.id,
a.name As username,
d.follower_count As MediaCount,
d.date As last_checked
From Accounts As a
join Followers As f ON a.id = f.follower_id
join DailyMetrics As d ON d.id = f.follower_id
join id_max on id_max.id=a.id and MaxDate=date
Where f.id = "WhatYouWant"