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"