查询一个用户ID的max to_date?

时间:2014-01-25 13:01:47

标签: sql database friend

我从SQL查询中得到了一些意想不到的结果。

表格数据:

users:
id   username
1    admin
2    x1
3    y1
4    z1

my_connections:
id user_id friend_user_id status
1  1       2              201
2  2       1              201
3  2       4              201
4  1       3              200
5  2       3              201
6  3       2              201
7  4       2              201
8  4       1              200

jobs:
id user_id company_name designation from_date     to_date
1  1       A            1           2011-06-01    2011-07-30
2  1       B            11          2011-08-02    2014-01-20
3  2       c            12          2012-05-02    2014-01-20
4  3       D            13          2010-05-02    2014-01-20
5  4       E            11          2009-05-25    2014-01-01

这是我的问题:

SELECT users.id,users.username,my_connections.user_id,my_connections.friend_user_id,my_connections.status,jobs.user_id,jobs.company_name,
jobs.designation,jobs.from_date,MAX(jobs.to_date)
FROM users
LEFT JOIN jobs ON jobs.user_id = users.id
LEFT JOIN my_connections ON my_connections.friend_user_id = users.id
WHERE my_connections.status = 201  AND users.id IN (1,3,4) 
GROUP BY jobs.company_name
ORDER BY jobs.to_date DESC

结果:

id username user_id friend_user_id status user_id company_name designs from_date to_date                   
3    ..       2         3             201       3      D           ..  2010-05-02 2014-01-20                          
4    ..       2         4             201       4      E           ..  2009-05-25 2014-01-01                                
1    ..       2         1             201       1      A           ..  2011-08-02 2014-01-20                               
1    ..       2         1             201       1      B           ..  2011-06-01 2011-07-30

在结果中,我想要每friend_user_id行一行,最大值为to_date。相反,我得到多行(如果jobs表中有多行)。

如何修复此查询?

1 个答案:

答案 0 :(得分:0)

如果您想在friend_user_id字段中获得唯一结果,则必须按friend_user_id进行分组。这将保证friend_user_id列的唯一结果。但我很确定你不希望这样,因为它可能显示不正确的数据。我仍然不确定查询是如何工作的,因为group by只包含一个字段。您必须按选择查询中的所有原始字段进行分组,并对不在group by子句中的字段执行聚合函数,例如:

SELECT users.id,users.username,my_connections.user_id,my_connections.friend_user_id,my_connections.status,jobs.user_id,jobs.company_name,
jobs.designation,jobs.from_date,MAX(jobs.to_date)
FROM users
LEFT JOIN jobs ON jobs.user_id = users.id
LEFT JOIN my_connections ON my_connections.friend_user_id = users.id
WHERE my_connections.status = 201  AND users.id IN (1,3,4) 
GROUP BY users.id,users.username,my_connections.user_id,my_connections.friend_user_id,my_connections.status,jobs.user_id,jobs.company_name,
jobs.designation,jobs.from_date
ORDER BY jobs.to_date DESC

在此查询中,group by子句中的所有字段都在select子句中。现在所有未包含在group by子句中的字段都可以使用如下函数:MAX(),AVG(),SUM()等。