简体   繁体   中英

Three joins with aggregate functions issue

I have three tables (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    | 
|_______________|___________|______________________|__________|

The following query is working fine (using just users,forum):

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

But when I try to query some data from the third table also with this query:

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

The result was duplicated (each record is duplicated) I do not why I see everything is ok so if anybody have any idea that could help me please HELP!!!

You probably don't need to do the join on the inner select statement.

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

i think, You want to search for last Comment, so just use group by function

GROUP BY f1.match_static_id

SQL Fiddle - would be useful

and there is no "users.id" collumn

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM