在查询结果中用username替换id外键

时间:2016-05-29 04:25:51

标签: mysql sql database postgresql

我有这个查询有效:

SELECT id, SUM(points) AS points
FROM leaderboard 
WHERE roundtime BETWEEN LOCALTIMESTAMP - INTERVAL '24 hours' AND LOCALTIMESTAMP
GROUP BY id ORDER BY points DESC LIMIT 25

可能会返回这样的内容:

id    points
------------
15    430
17    278
16    92

但是,我不想在结果中使用id,而是将其替换为id对应的用户名(来自users表)

用户表:

id   username
-------------
15   Frank
16   Joe
17   Andy

这样第一个查询就会产生:

username  points
----------------
Frank     430
Andy      278
Joe       92

我尝试使用子查询,但无法使其正常工作,而且它变得混乱。这样做有好办法吗?

2 个答案:

答案 0 :(得分:1)

尝试将查询作为子查询。我将users表添加到您的查询中:

SELECT p.username, q.points from(
(SELECT id, SUM(points) AS points
FROM leaderboard 
WHERE roundtime BETWEEN LOCALTIMESTAMP - INTERVAL '24 hours' AND LOCALTIMESTAMP
GROUP BY id ORDER BY points DESC LIMIT 25
) q 
LEFT JOIN users_table p
ON p.id = q.id

以上是演示如何从您已构建的查询中提取所需信息。

我希望这有助于解释结合上述内容的此查询所发生的事情(这更简洁):

SELECT p.username, q.points 
FROM leaderboard q 
LEFT JOIN users_table p
ON p.id = q.id
WHERE roundtime BETWEEN LOCALTIMESTAMP - INTERVAL '24 hours' AND    LOCALTIMESTAMP
GROUP BY id 
ORDER BY points 
DESC LIMIT 25

Here is an example of this query

答案 1 :(得分:1)

你只需要一个普通的JOIN来做你需要的事情。不要使用子查询,它会使SQL慢于它所需的速度:

SELECT u.username, SUM(l.points) AS points
  FROM leaderboard l
        INNER JOIN yourUserTable u
                ON l.id = u.ColumnNameForTheUserId
 WHERE roundtime BETWEEN LOCALTIMESTAMP - INTERVAL '24 hours' 
                     AND LOCALTIMESTAMP
 GROUP BY u.username 
 ORDER BY points DESC 
 LIMIT 25