0

我对 sql 相当陌生,并且当用户不在表 Y 中时,我尝试从表 X 中获取数据,并且玩家 ID 和世界 ID 的组合并且玩家访问权限为 2。

让我进一步解释一下:

表 X(用户表)

+-----------+----------+------------+
| uid       | access   |  more data |
+-----------+----------+------------+
| 1         | 2        |    ....    |
| 2         | 1        |    ....    |
| 3         | 2        |    ....    |
+-----------+----------+------------+

表 Y(世界)

+-----------+-----------+
| userUuid  | worldUuid |
+-----------+-----------+
| 1         | 1         |
| 2         | 2         |
| 3         | 2         |
+-----------+-----------+

当我想获取我仍然可以添加到世界 1 的所有用户时,我想从用户 3 那里获取用户信息。

用户 1 已经在世界 1 中,用户 2 没有访问级别 2,用户 3 还没有在世界 1 中,但拥有访问级别 2。

我正在使用 medoo,这是我目前的声明:

$database->select("User", [
    "[>]UserInWorld" => ["uid" => "userUid"]
], [
    "uid",
    "displayname",
    "surname",
    "email"
], [
    "AND" => [
        "worldUuid[!]" => $worldUuid,
        "access" => 2
    ]
]);

worldUuid 将是我想让用户添加的世界。

使用 ->debug() 时,查询如下所示:

SELECT "uid","displayname","surname","email" 
FROM "User" 
LEFT JOIN "UserInWorld" ON "User"."uid" = "UserInWorld"."userUid" 
WHERE "worldUuid" != '4dafb8c0-57234ff2-03eb-af7f7a5e' 
AND "access" = 2

编辑:我在下面使用 medoo 发布了一个解决方案

4

3 回答 3

1

如果我理解正确,您应该能够执行以下操作:

SELECT
    uid,
    displayname,
    surname,
    email 
FROM
    User
    LEFT JOIN UserInWorld ON User.uid = UserInWorld.userUid AND worldUuid = 1
    INNER JOIN (
        SELECT DISTINCT
            userUid
        from
            UserInWorld
        WHERE
            worldUuid != 1
    ) AS InOtherWorld ON InOtherWorld.userUid = User.uid
WHERE
    access = 2
    AND UserInWorld.userUid IS NULL

左连接将在可能的情况下连接世界上的人们,然后UserInWorld.userUid IS NULL有效地将其剥离到那些不在世界上的人。

于 2016-05-05T20:08:35.687 回答
0

你说:

当用户不在表 Y 中且玩家 ID 和世界 ID 的组合且玩家访问权限为 2 时,我试图从表 X 中获取数据

如果我理解它应该是:

select * from X where X.access = 2 and X.uid not in (
    select Y.userUuid from Y
)
于 2016-05-05T20:14:17.160 回答
0

睡个好觉后,我想出了如何使用 medoo 类来做到这一点

$database->select("User", [
    "[>]UserInWorld" => ["uid" => "userUid"]
], [
    "uid",
    "displayname",
    "surname",
    "email"
], [
    "AND" => [
        "OR" => [
            "worldUuid[!]" => [$worldUuid],
            "worldUuid" => NULL
        ],
        "access" => 2
    ],
    "GROUP" => "uid"
]);

我想为 $worldUuid 选择用户。

这将生成以下 sql 语句:

SELECT "uid","displayname","surname","email" FROM "User" 
LEFT JOIN "UserInWorld" ON "User"."uid" = "UserInWorld"."userUid" 
WHERE ("worldUuid" NOT IN ('1') OR "worldUuid" IS NULL) 
AND "access" = 2
GROUP BY "uid"

这将选择所有(唯一)用户,他们还没有世界,或者在世界上我正在获取用户并且他们有访问级别 2

于 2016-05-06T10:48:08.427 回答