簡體   English   中英

SQL:連接另一個表中的值

[英]SQL: Join value from another table

我有1個名為accounts和其他一個叫level_points

基本上,該想法是確定X級所需的最小點數是多少。

賬戶結構

idname ..等points

Level_Points結構

levelpoints

這里的值例如

(1, 5)
(2, 10)
(3, 15)

我可以使用此查詢來計算級別

SELECT `level` 
FROM `level_points` 
WHERE `points` <= (SELECT `points` 
                   FROM `accounts` 
                   WHERE `id` = 'x') 
ORDER BY `level` 
DESC LIMIT 1

我的問題是,現在我正嘗試連接表以獲取類似信息(對於accounts表中的每個用戶)

結果:

For user 1: `id`, `name` etc... `points`, `level`
For user 2: `id`, `name` etc... `points`, `level`
For user 3: `id`, `name` etc... `points`, `level`

我不確定如何使用聯接來做到這一點,而且我似乎在這里找不到答案對我有幫助。

嘗試這樣的事情:

SELECT ac.id,
    ac.name,
    ac.points,
    le.level
FROM account ac,
    level le
WHERE ac.id = 'x'
    AND le.level= (
        SELECT level
        FROM level_points
        WHERE points <= (
                SELECT points
                FROM accounts
                WHERE id = 'x'
                )
        ORDER BY level DESC LIMIT 1
        );

要為所有玩家提供此服務,您可以執行以下操作:

SELECT ac.id,
    ac.name,
    ac.points,
    le.level
FROM accounts ac,
    level_points le
WHERE le.level= (
        SELECT level
        FROM level_points
        WHERE points <= (
                SELECT points
                FROM accounts ac2
                WHERE ac2.id = ac.id
                )
        ORDER BY level DESC LIMIT 1
        );

檢查這個小提琴以查看它是否有效

嘗試這個 ..

       select column1 from table1 
       inner join table2 on table1.column = table2.column
       where table2.column=0

看看這個

http://www.w3schools.com/sql/sql_join.asp

我將因此更改Level_Points表:

ALTER TABLE Level_Points
ADD max_points INT NOT NULL;

ALTER TABLE Level_Points
ADD CONSTRAINT CK_LevelPoints_VerifyPoints CHECK(points < max_points);

在這種情況下, points列將存儲最小數字。 點數和max_points列將存儲最大num。 當前水平所需的分數。 接下來,我必須確保該級別是連續的,沒有重疊並且沒有差距(但是這些限制超出了此答案的目的:請參閱Alexander Kuznetsov撰寫的本文 )。 另外,還需要一些索引:

CREATE UNIQUE INDEX IUN_LevelPoints_points
ON Level_Points(points);

CREATE UNIQUE INDEX IUN_LevelPoints_points_maxpoints
ON Level_Points(points, max_points); -- This index is useful because the final query needs both columns: points and max_points; in SQL Server, max_points column can be covered column: ... ON Level_Points(points) INCLUDE (max_points), then the first index (IUN_LevelPoints_points) is no more needed

此表中存儲了一些示例行:

INSERT INTO Level_Points ("level", "points", "max_points") VALUES (0, 0,  5); -- level 0 for players which have less than 5 points
INSERT INTO Level_Points ("level", "points", "max_points") VALUES (1, 5,  10);
INSERT INTO Level_Points ("level", "points", "max_points") VALUES (2, 10, 15);
INSERT INTO Level_Points ("level", "points", "max_points") VALUES (3, 15, 100);
INSERT INTO Level_Points ("level", "points", "max_points") VALUES (4, 100,2147483647); -- 2147483647 is the maximum value for a INT in SQL Server

在這種情況下,最終查詢只是一個簡單的左/內聯接:

SELECT ..., lvl.level
FROM accounts AS acc LEFT JOIN Level_Points AS lvl 
ON acc.points >= lvl.points 
AND acc.points < lvl.max_points

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM