2013-08-24 64 views
0

我有以下结构:Mysql的选择与最大多加入

Attended: 
    id 
    user 
    date 


Meetings: 
    id 
    data 
    place 

Places 
    id 
    name 

users 
    id 
    name 

我试图让用户参加了此次会议最大的日期,我可以通过运行以下要做到这一点:

select (meetings.date), places.name, meetings.id, attend.user 
from attend 
    inner join meetings on meetings.Id = attend.meeting 
    inner join places on meetings.place = places.id 
WHERE meetings.date IN (select max(meetings.date) from meetings) 

然而,只有日期是正确的,如果我尝试打印出地点的名称也不会是用最大日会议有关的地方,但它实际上与第一打印位置我从参加的桌子上得到的一排。

根据会议日期查找最长入院日期的最佳方法是什么?

+0

您的查询应该返回谁出席上有一个会议日期最近会议的所有用户。不过,我不能说这是否是你真正想要的。 –

+0

是的,这是我真正想要的,我确实知道,但地名将返回不正确的信息。如果我最后一次出席是为A地点举行的会议1,但是我的第一次出席是用于会议2,即地点B,那么查询将打印地点B而不是A – Dani

+0

选择一行的好方法列是最大值(或最小值)是通过它来排序并限制结果集:'ORDER BY meetings.date DESC LIMIT 1'。我会张贴这个答案,但根据你的问题,我不完全确定你在找什么。 –

回答

1

你在找这样的事吗?

SELECT a.user_name, a.meeting, a.place_name, a.date 
    FROM 
(
    SELECT a.user, a.meeting, m.date, p.name place_name, u.name user_name 
    FROM attended a JOIN meetings m 
     ON a.meeting = m.id JOIN places p 
     ON m.place = p.id JOIN users u 
     ON a.user = u.id 
) a JOIN 
(
    SELECT a.user, MAX(m.date) date 
    FROM attended a JOIN meetings m 
     ON a.meeting = m.id 
    GROUP BY user 
) q 
    ON a.user = q.user 
    AND a.date = q.date 
ORDER BY user_name 

输出示例:

 
| USER_NAME | MEETING | PLACE_NAME |       DATE | 
-------------------------------------------------------------------- 
| User 1 |  2 | Place 2 | August, 11 2013 00:00:00+0000 | 
| User 2 |  1 | Place 1 | July, 12 2013 00:00:00+0000 | 
| User 3 |  1 | Place 1 | July, 12 2013 00:00:00+0000 | 

这里是SQLFiddle演示