我有一个名为accounts
的表,另一个名为level_points
基本上,我们的想法是确定你需要达到的最低点数是多少。
帐户结构
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
我的问题是,现在我正在尝试加入表格以获得类似的内容(对于帐户表格中的每个用户)
结果:
For user 1: `id`, `name` etc... `points`, `level` For user 2: `id`, `name` etc... `points`, `level` For user 3: `id`, `name` etc... `points`, `level`
我不确定如何使用连接这样做,我似乎无法在这里找到帮助我的答案。
答案 0 :(得分:1)
尝试这样的事情:
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
);
检查this fiddle是否正常工作
答案 1 :(得分:0)
试试这个..
select column1 from table1
inner join table2 on table1.column = table2.column
where table2.column=0
看看这个
答案 2 :(得分: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
列将存储最大数量。当前水平所需的积分。接下来,我必须确保这个级别是连续的,它们没有重叠并且没有间隙(但这些限制超出了这个答案的目的:见Alexander {Kuznetsov写的this article)。此外,还需要一些索引:
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