SQL:从另一个表加入值

时间:2013-09-15 10:46:42

标签: mysql sql

我有一个名为accounts的表,另一个名为level_points

基本上,我们的想法是确定你需要达到的最低点数是多少。

帐户结构

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

我的问题是,现在我正在尝试加入表格以获得类似的内容(对于帐户表格中的每个用户)

结果:

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

我不确定如何使用连接这样做,我似乎无法在这里找到帮助我的答案。

3 个答案:

答案 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

看看这个

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

答案 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