繁体   English   中英

一个针对三个表的MySQL查询:A中有多少不在B或C中?

[英]A MySQL query addressing three tables: How many from A are not in B or C?

我在制定一个MySQL查询来执行以下任务时遇到了一个问题,尽管我在这里看到了类似的查询,但它们与这一查询有很大的不同,可以让我无意中调换它们。 这个问题很(很)容易说明。 我有三个表,“成员”,“ dog_shareoffered”和“ dog_sharewanted”。 成员可能想要出售或购买的商品有零个,一个或多个广告,并且详细信息以及放置广告的成员的ID一起存储在相应的提供或想要的表中。 列“ id”对于成员而言是唯一的,并且对于所有三个表都是相同的。 我要查询的是询问有多少个成员未在任一表中放置广告。

我尝试了几种方法来问这个。 我能得到的最接近的查询不会崩溃! (无论如何我都不是MySQL专家)。 根据我从其他示例中收集的内容,以下内容进行了汇总,但返回零行,我知道结果应大于零。

SELECT id 
  FROM members 
 WHERE id IN (SELECT id 
                FROM dog_sharewanted 
               WHERE id IS NULL) 
   AND id IN (SELECT id 
                FROM dog_shareoffered 
               WHERE id IS NULL)

与我所见过的“ JOIN”不同,该查询看起来很容易理解,但我猜测也许我需要某种Join,但是在这种情况下会怎样呢?

如果您在任何一个表中都不希望有广告,那么您要查询的是:

SELECT id
FROM members
WHERE id NOT IN ( any id from any other table )

要从其他表中选择ID,请执行以下操作:

SELECT id
FROM <othertable>

因此:

SELECT id
FROM members
WHERE id NOT IN (SELECT id FROM dog_shareoffered)
 AND  id NOT IN (SELECT id FROM dog_sharewanted)

我添加了“ SELECT DISTINCT”,因为一个成员可能会投放许多广告,但是只有一个ID。 我以前在上面的子查询中有一个SELECT DISTINCT ,但是正如下面的注释所述,这不是必需的。

如果要避免子查询(可能会提高性能,取决于..),则可以使用一些LEFT JOIN:

SELECT members.id
FROM members
LEFT JOIN dog_shareoffered
 ON dog_shareoffered.id = members.id
LEFT JOIN dog_sharewanted
 ON dog_sharewanted.id = members.id
WHERE dog_shareoffered.id IS NULL
  AND dog_sharewanted.id IS NULL

工作原理:

它接受表members并将其连接到id列上的其他两个表。 LEFT JOIN意味着,如果members表中存在一个成员,但我们要加入的表中存在该members (例如dog_shareoffered ),则对应的dog_shareoffered列中将为NULL

因此, WHERE条件挑选出在dog_shareoffereddog_sharewanted中都具有NULL ID的行,这意味着我们在其他两个表中的members中没有对应的ID的情况下找到了ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM