[英]SQL: Join value from another table
我有1個名為accounts
和其他一個叫level_points
基本上,該想法是確定X級所需的最小點數是多少。
賬戶結構
id
, name
..等points
Level_Points結構
level
, points
這里的值例如
(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
看看這個
我將因此更改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.