1

我正在尝试创建一个 PHP 文件,该文件将打开我的 PHPBB3 数据库并检索论坛上所有 Minecraft 用户名的列表,该列表将用作相关游戏服务器上的白名单。用户名(urbb_profile_fields_data.pf_mcusername)需要通过以下过滤:用户名不为空,不为空,未被禁止(ID与urbb_banlist.ban_userid内的ID不匹配)并已激活(urbb_users.user_inactive_reason为0 )。

诚然,我对 SQL 的了解很差,但我已经完全正常工作并实现了:

SELECT urbb_profile_fields_data.pf_mcusername, urbb_profile_fields_data.user_id, urbb_banlist.ban_userid FROM urbb_profile_fields_data, urbb_banlist WHERE ((pf_mcusername IS NOT NULL) AND (pf_mcusername <> '')) AND ban_userid != urbb_profile_fields_data.user_id

但是,当我尝试使用: urbb_users.user_inactive_reasonwithinSELECTurbb.userswithinFROM时,SQL 将检索到 7000 多个似乎循环的结果。一旦我进入,就会发生这种urbb_users情况FROM

毫无疑问,我在这里缺少一些东西,因为我对 JOIN 不是很熟悉(我已经阅读了一些关于它的教程)所以我希望有人可以在这里提供帮助!

谢谢。

4

1 回答 1

1

您的查询实现存在重大问题。即使没有涉及任何其他表,它实际上也不应该工作。

FROM A, B”在 SQL 中的意思是“创建另一个表,其中包含 A 和 B 的所有字段,并且它的行都是 A 和 B 的所有可能组合”并从那里选择。因此,假设每个表中有 4 行,结果表将有 16 行。要过滤不必要的行,请使用条件"WHERE A.user_id = B.user_id"。这样,结果表将只有行,这两个部分实际上都对应于同一用户。

您的查询虽然有“WHERE A.user_id != B.user_id”,但应该返回一个循环集,其中包含两个部分不匹配的所有行。如果你在禁止列表中只有 1 名玩家,它会起作用,但如果至少有 2 名,它不仅会循环,还会让被禁止的玩家进入结果列表。此外,如果您没有禁止用户,则查询结果将为空。

正确的查询如下所示:

SELECT A.username, B.user_id FROM A LEFT JOIN B ON A.user_id = B.banned_id
WHERE B.banned_id IS NULL

基本上,您在表 A 中查找与表 B 中不匹配的行。要将其他表添加到查询中,您需要像这样连接它们:

SELECT A.username, B.user_id FROM A LEFT JOIN B ON A.user_id = B.banned_id
LEFT JOIN C ON A.user_id = C.user_id WHERE B.banned_id IS NULL

希望能帮助到你...

于 2012-12-24T05:46:26.910 回答