2016-05-29 12 views
3

をユーザ名とIDの外部キーを交換して代わりに結果にIDを持つの、しかしは、私が働くこのクエリ持つクエリ結果に

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

を、 idを(ユーザテーブルの)ユーザ名に置き換えたい(ユーザのテーブルから)

ユーザテーブル:

私は、サブクエリを使用してみましたが、かなりそれが働いて得ることができなかったし、それが厄介になった

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

:10

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

の最初のクエリ結果だから。これを行う良い方法はありますか?

答えて

1

あなただけのプレーンはあなたが必要なものを行うために、JOIN必要があります。サブクエリを使用しないでください、それはそれは必要以上にあなたのSQLが遅くなります:私はl.id、GROUP BY `にl.id` BY` GROUPを変更するまで

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 
+0

これはエラーを投げていた、u.username、ポイント。それは2つの 'がGROUP BY句に現われなければならない、または集約関数で使わなければならないと言った' –

+0

Ops、私の悪い、私はグループを変更するのを忘れてしまった。ごめんなさい。 –

+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

関連する問題