2014-10-17 98 views
0

我有我的数据库中下表:获取行的最后一次出现在MySQL LEFT JOIN

USERS

+-------+-------------------------------------+ 
| id |    name     | 
+-------+-------------------------------------+ 
| 1 | Johnny Appleseed     | 
| 2 | Pete Jones       | 
| 3 | John Doe       | 
| 4 | Jane Plick       | 
+-------+-------------------------------------+ 

报告]

+-------+-------+-----------------------------+ 
| id | owner | title      | 
+-------+-------+-----------------------------+ 
| 1 | 1  | Weekly report #86   | 
| 2 | 1  | Weekly report #87   | 
| 3 | 1  | Weekly report #88   | 
| 4 | 2  | Weekly report #1   | 
| 5 | 3  | Weekly report #33   | 
| 6 | 3  | Weekly report #34   | 
+-------+-------------------------------------+ 

我需要做什么是GROUP的名字的结果,所以列表本身是字母顺序,但我需要最后一次出现与用户的ID相匹配的行。

REPORTS表的“owner”列与USERS表的“id”列相匹配。

我想要的结果是这样的:

Jane Plick  |  
John Doe   | Weekly Report #34 
Johnny Appleseed | Weekly Report #88 
Pete Jones  | Weekly Report #1 

我当前的查询ALMOST作品,但它只会显示用户第一周报,不是最后一次。

SELECT * FROM users AS a LEFT JOIN ppp_reports AS b ON a.id=b.owner WHERE a.active=1 GROUP BY a.id ORDER BY a.firstname ASC 

我已经尝试了很多不同的变化,但我总是留下来自REPORTS表的第一行。

任何帮助,非常感谢。

+0

这是标准mysql行为,当你正在做一个'group by'。它会从匹配记录中选择第一个/最早的值以填写组中请求的所有字段。这基本上是“每组最多”,其中“最近的”和n = 1。 – 2014-10-17 14:53:02

+0

您是否假设'reports'表中'id'的最高数字值是最近期的,或者您是否有任何额外字段(如时间戳)来权威性地确定报告的年龄? – 2014-10-17 15:16:43

回答

0

在您的特定情况下的所有报告,名为“每周报告#X”,你可以试试这个:

SELECT a.id, a.name, MAX(b.title) 
    FROM users AS a 
    LEFT JOIN ppp_reports AS b ON a.id=b.owner 
WHERE a.active=1 
GROUP BY a.id, a.name 
ORDER BY a.name ASC 

this fiddle

如果报告可能有其他名称,则必须找到另一种方法来区分上次报告与其他报告。

+0

这工作得很好。由于ppp_reports表的ID将始终递增,所以与用户ID匹配的最后一个报表将始终为最新。所以,而不是MAX(b.title)我做了MAX(b.id),现在都很好。 – matcartmill 2014-10-17 15:05:06

0

假设您的报告ID按日期编号,即报告ID 2是始终报告ID 1后,这两个查询应工作:

select t.id, t.name, r.title from 
    (select u.id, u.name, max(r.id) as report_id 
    from users u 
    left join reports r on r.owner = u.id 
    group by u.id, u.name) as t 
    left join reports r on t.report_id = r.id; 

OR

select u.id, u.name, r.title from 
    users u 
    left join 
    (select r.owner, max(r.id) as report_id 
    from reports r 
    group by r.owner) as latest_report on u.id = latest_report.owner 
    left join reports r on latest_report.report_id = r.id; 

的想法是,您需要通过用户标识识别正确的报告,然后将报告表加回到报告表中以获取报告的正确名称。

Link to SQL Fiddle