【问题标题】:Selecting ALL data from two different tables从两个不同的表中选择所有数据
【发布时间】:2014-06-22 18:28:12
【问题描述】:

我想显示被禁止的用户和 IP,但它们位于两个不同的表中。 我有网站用户表,该表包含“禁止”列和另一个用于禁止 IP 的表。所以我想要这样的东西:

选择

ipban.ip、ipban.admin、ipban.reason

users.username WHERE ban=1

(这个查询不正确,我写这个只是为了解释我的问题)

然后将其显示在表格中。 那么,该怎么做呢?

【问题讨论】:

  • 在公共字段上使用 INNER JOIN。 SELECT * FROM user INNER JOIN ip ON users.field = ip.field WHERE users.ban = 1 或类似的东西。
  • 这两个表之间有什么关系还是互斥的?
  • 请在您的问题中添加有关这两个表架构的信息。必须有一个列来连接这两个表,例如,在 ips 表中有一个 user_id。或者,您的数据库架构解释了您的系统,以便可以禁止用户或禁止 IP。在这种情况下,您尝试创建的显示表信息错误。
  • 这两个表没有连接,它们没有任何可以匹配的字段。
  • 看看Elanha的回答,你需要UNION

标签: mysql sql select


【解决方案1】:

使用 UNION,类似这样:

(SELECT NULL, ipban.ip, ipban.admin, ipban.reason FROM ipban)
UNION ALL
(SELECT users.username,NULL,NULL,NULL FROM users WHERE ban=1)

我假设这两个表没有可加入的公共字段。

【讨论】:

  • 这确实有效,尽管我之前尝试过类似的查询。谢谢!
【解决方案2】:
SELECT ipban.ip, ipban.admin, ipban.reason, users.username FROM ip, users WHERE users.somekey = ipban.somekey and users.ban = 1

假设banusers 表中。

您还可以使用 INNER JOIN 连接表:

SELECT ipban.ip, ipban.admin, ipban.reason, users.username FROM users INNER JOIN ip ON users.somekey = ip.somekey WHERE users.ban = 1

要从两个表中获取所有列,请使用

SELECT * FROM users INNER JOIN ip ON users.somekey = ip.somekey WHERE users.ban = 1

【讨论】:

  • 顺便提一下,这两个表没有连接,也没有任何匹配的字段。
  • 如果表未连接,则使用 UNION 获取完整列表不是一个好的解决方案。考虑有两个查询。如果在 users 表中找到了用户,那么您不必检查 ip 表,反之亦然。使用 UNION 也不会为您提供索引,并且随着数据库的增长,此查询会越来越慢。
  • UNION 有效,但我在页面上的两个选项卡中将它分成两个查询。顺便说一句,users 表仅适用于没有任何 IP 地址的注册用户,而 ipban 表适用于未注册且没有用户名但他们正在做他们不应该在网站上做的事情的用户。因此,ip 和 users 表没有连接,如果用户被禁止,他不在 ipban 表中。还是谢谢。
【解决方案3】:

选择 ipban.ip,ipban.admin,ipban.reason,users.username 从 ipban 内部加入用户 关于共同属性(在这里你应该提供一个列在两个表中) 其中禁令=1;

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多