我正在尝试创建一个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
内的SELECT
在urbb.users
内{和} FROM
,SQL将检索超过7000个似乎循环结束的结果。一旦我在urbb_users
中输入FROM
,就会发生这种情况。
毫无疑问,我在这里缺少一些东西,因为我对JOIN并不熟悉(我已经阅读了一些教程),所以我希望有人可以帮忙!
感谢。
答案 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
希望它有所帮助...