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

时间:2012-12-24 04:31:09

标签: sql database phpbb

我正在尝试创建一个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_reason内的SELECTurbb.users内{和} FROM,SQL将检索超过7000个似乎循环结束的结果。一旦我在urbb_users中输入FROM,就会发生这种情况。

毫无疑问,我在这里缺少一些东西,因为我对JOIN并不熟悉(我已经阅读了一些教程),所以我希望有人可以帮忙!

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

您的查询虽然有“WHERE A.user_id!= B.user_id”,但应返回两个部分不匹配的所有行的循环集。如果你只有一个禁止列表中的玩家它会起作用,但是如果有至少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

希望它有所帮助...