2

我是 Web 开发的学生,我遇到了 MySQL 语句的问题。一个游戏社区要求我创建某种小网站,在那里他们可以看到他们禁止了哪些人。

我使用了 2 个表,“帐户”和“禁令”。账户的布局有点像这样

account_id  username  (more columns)
----        ----      ----
1           hey       ...
2           hdf       ...
3           sdf       ...
4           admin     ...

“禁令”的布局是:

ban_id      account_id    bannedby_id    (more columns)
----        ----          ----           ----
1           1             4              ...
2           3             4              ...

在这种情况下,ID 为 4 的管理员已禁止 ID 为 1 和 3 的帐户。我想创建一个查询,其中我同时拥有被禁止人员的姓名和在单个结果中禁止他的管理员的姓名。

我现在首先这样做:

SELECT bans.*, accounts.username FROM bans, accounts WHERE accounts.account_id = bans.account_id

然后遍历所有结果并从我得到的结果中选择管理员名称:

while($baninfo = mysql_fetch_assoc($sqlBans))
{
    mysql_query("SELECT username FROM accounts WHERE account_id = '" . $baninfo['bannedby_id'] . "'");
}

这行得通,但我认为这不是正确的方法。我认为必须有一个 MySQL 函数可以进行这样的查询,但我在 Google 上搜索过,但找不到。

为了清楚起见,这是我想从查询中获取结果的方式:

ban_id   account_id   account_username   bannedby_id   admin_username   (other columns from Bans table)
----     ----         ----               ----          ----             ----
1        1            hey                4             admin            ...
2        3            sdf                4             admin            ...

如果这是一个非常愚蠢的问题,我很抱歉,但我可以解决它。我希望你们能给我一个解决方案。我经常使用这个网站,因为我遇到了一些小问题,而且它总是有很好的答案。

问候,马克

4

4 回答 4

1

使用accounts 表两次——每次作为内联视图并单独加入。

select a.username as banned, b.username as by_who
from accounts a, accounts b, ban
where a.account_id = ban.account_id
and b.account_id = ban.account_id
于 2012-07-11T19:28:24.437 回答
1

你想要的是一个JOIN操作:

SELECT ban_id, banned.account_id, banned.username AS account_username,
    bannedby_id, admin.username AS admin_username, etc....
FROM bans
LEFT JOIN accounts AS banned ON banned.account_id = bans.account_id
LEFT JOIN accounts AS admin ON banned.banned_by = admin.account_id
于 2012-07-11T19:29:21.027 回答
0

尝试

SELECT b.ban_id, ac.account_id, ac.username AS banned, b.bannedby_id AS mod FROM accounts ac, bans b WHERE ac.account_id = b.account_id ORDER BY b.bannedby_id DESC
于 2012-07-11T19:31:27.003 回答
0
select b.ban_id,
    b.account_id,
    a.username as account_username,
    b.bannedby_id,
    a2.username as admin_username,
from bans b
inner join accounts a on b.account_id = a.account_id
inner join accounts a2 on b.bannedby_id = a2.account_id
于 2012-07-11T19:28:04.330 回答