与聚合函数问题的三个连接问题

时间:2013-07-10 13:37:48

标签: mysql join aggregate-functions

我有三个表(MySQL):

matches:
 ___________________________
|match_static_id| team_name |
|_______________|___________|
|  1            |  Italy    |
|  2            |  France   |
|_______________|___________|

users:
 ___________________________
|user_id        | username  |
|_______________|___________|
|  1            |  Dolly    |
|  2            |  Didi     |
|_______________|___________|

forum:
 _____________________________________________________________
|match_static_id| comment   | timestamp            | user_id  |
|_______________|___________|______________________|__________|
|  1            |  Hi       | 2013-07-10 12:15:03  |     2    |
|  1            |  Hello    | 2013-07-09 12:14:44  |     1    | 
|_______________|___________|______________________|__________|

以下查询工作正常(仅使用用户,论坛):

SELECT  f1.match_static_id,
  f2.comments_no, 
  f2.maxtimestamp, 
  users.username
FROM forum AS f1

INNER JOIN
(
  SELECT match_static_id, 
    max(timestamp) maxtimestamp,
    count(match_static_id) AS comments_no
  FROM forum
  GROUP BY match_static_id
) AS f2  ON f1.match_static_id = f2.match_static_id
        AND f1.timestamp = f2.maxtimestamp
INNER JOIN users on users.user_id = f1.user_id
Order BY f2.maxtimestamp DESC

但是当我尝试使用此查询查询第三个表中的某些数据时:

SELECT  f1.match_static_id,
  f2.comments_no, 
  f2.maxtimestamp, 
  users.username,
  matches.team_name
FROM forum AS f1

INNER JOIN
(
  SELECT match_static_id, 
    max(timestamp) maxtimestamp,
    count(match_static_id) AS comments_no
  FROM forum
  GROUP BY match_static_id
) AS f2  ON f1.match_static_id = f2.match_static_id
        AND f1.timestamp = f2.maxtimestamp
INNER JOIN users on users.id = f1.user_id
INNER JOIN matches on matches.match_static_id = f2.match_static_id
Order BY f2.maxtimestamp DESC

结果是重复的(每条记录都是重复的)我不知道为什么我看到一切都好 所以如果有人有任何想法可以帮助我请帮助!!!

2 个答案:

答案 0 :(得分:0)

您可能不需要在内部select语句上进行连接。

SELECT  
  f1.match_static_id,
  count(f1.comment) as comments_no, 
  max(timestamp) as maxtimestamp, 
  users.username,
  matches.team_name
FROM 
    forum AS f1
INNER JOIN users u on u.id = f1.user_id
INNER JOIN matches m on m.static_id = f1.match_static_id
GROUP BY m.match_static_id
ORDER BY maxtimestamp DESC

答案 1 :(得分:-1)

我想,你想搜索最后一条评论,所以只需按功能分组

GROUP BY f1.match_static_id

SQL小提琴 - 非常有用

并且没有“users.id”列