SQL:检索自定义配置文件字段,禁止状态和非活动状态



我正在尝试创建一个PHP文件,该文件将打开我的PHPBB3数据库并检索论坛上所有Minecraft用户名的列表,该列表将用作相关游戏服务器上的白名单。需要对用户名(urbb_profile_fields_data.pf_mcusername)进行如下过滤:用户名不为空,不为空,不被禁止(ID与urbb_banlist.ban_userid中的ID不匹配),并且已经激活(urbb_users. name)。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

然而,当我尝试使用:SELECT中的urbb_users.user_inactive_reasonFROMurbb.users中,SQL将检索超过7000个似乎循环和重复的结果。当我在FROM中输入urbb_users时,就会发生这种情况。

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

谢谢。

查询的实现存在一个重大问题。即使没有其他表,它也不能正常工作。

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

您的查询虽然有"WHERE a.s er_id != b.s er_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

相关内容

最新更新