【问题标题】:MySQL join and exclude?MySQL 加入和排除?
【发布时间】:2011-07-14 07:42:42
【问题描述】:

我有两个表,表 A 有两列:IP 和 ID,表 B 有列:ID 和额外信息。我想为不在表 A 中的 IP 提取表 B 中的行。所以如果我在表 A 中有一行

id = 1
ip = 000.000.00
id = 2
ip = 111.111.11

我在表 B 中有行

id = 1
id = 2

那么,给定 ip = 111.111.11,如何返回表 B 中的第 1 行?

【问题讨论】:

  • 将您接受的答案更改为 Marc 的答案。

标签: php mysql join


【解决方案1】:
select b.id, b.* 
from b
left join a on a.id = b.id
where a.id is null

这将拉取 B 中与 A 中没有匹配行的所有行。如果您只想尝试该 IP,可以将特定 IP 添加到 where 子句中。

【讨论】:

  • 为什么同时使用 b.id 和 b.* - 太野心了
  • 因为OP说表中还有其他字段,但没有指定它们。所以我特地选择了他在问题中包含的字段,并输入了*以涵盖他没有涵盖的字段
  • 如此明显,但不知何故我无法自己解决这个问题,非常感谢!
【解决方案2】:

拼写您所描述的内容的最简单和最容易阅读的方法是:

SELECT * FROM `B` WHERE `ID` NOT IN (SELECT `ID` FROM `A`)

不过,您应该知道,使用子查询来处理类似的事情有historically been slower,而不是使用self-join,因为后者更容易优化,可能如下所示:

SELECT
   `B`.*
FROM
   `B`
LEFT JOIN
   `A` ON `A`.`ID` = `B`.`ID`
WHERE
   `A`.`ID` IS NULL

然而,技术一直在进步,这在多大程度上是正确的(或者甚至是否这是真的)depends on the database software you're using

您应该测试这两种方法,然后为您的用例确定可读性和性能的最佳平衡。

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 2017-10-26
    • 2013-04-04
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多