在JOIN中进行MySQL排序/分组

时间:2015-10-13 14:15:07

标签: sql join correlated-subquery

您有以下架构

-- 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,相关子查询等,但没有一个适合我。

BigCompany的关注者的预期结果:

id    username    follower_count   media_count  'last_checked'
---------------------------------------------------------------
25    SomePerson  500              27            2015-10-13

3 个答案:

答案 0 :(得分:1)

执行一些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)

答案 1 :(得分:0)

试试这个:

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 DailyMetrics将消除除最近日期之外的所有行。

这会给你:

| id |       name | media_count |                      date |
|----|------------|-------------|---------------------------|
| 25 | SomePerson |          27 | October, 13 2015 00:00:00 |

答案 2 :(得分:0)

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"