2015-10-13 38 views
0

喜有以下模式MySQL的排序/分组内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,相关的子查询等,但没有一个为我工作。

BigCompany追随者预期结果:

​​

回答

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) 
+0

这个作品很棒,速度很快,谢谢 – AlasdairC

+0

很好听! – jarlh

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 | 
+0

HI SH应该已经更清楚了,我需要指定哪些帐户,我正在寻找追随者,例如WHERE followers.id = 999 – AlasdairC

+0

@AlasdairC - 没问题,你可以将其添加到查询的末尾,查看我更新的查询。 –

+0

这将返回900K行,大量重复行 – AlasdairC

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" 
+0

OP正在使用Mysql而不是SQL Server –

+0

你怎么知道? – Balinti

+1

来自标题:** JOIN内部的MySQL排序/分组** –