2

我在制定 MySQL 查询来执行以下任务时遇到问题,尽管我在这里看到过类似的查询,但它们与这个查询有很大的不同,足以让我尝试转置它们。问题是(相当)简单的陈述。我有三个表,“成员”、“dog_shareoffered”和“dog_sharewanted”。会员可能有零个、一个或多个关于他们想要出售或想要购买的东西的广告,详细信息连同放置广告的会员的 ID 一起存储在相应的 offer 或 Want 表中。列“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's,但我猜我可能需要某种加入,但在这种情况下会怎么样?

4

1 回答 1

6

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

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表中但存在我们要加入的表中(例如dog_shareoffered),那么相应的dog_shareoffered列将包含NULL在其中。

因此,该WHERE条件会挑选出在和NULL中都有 id 的行,这意味着我们在其他两个表中找到了没有对应 id 的 id。dog_shareoffereddog_sharewantedmembers

于 2012-02-20T01:22:30.090 回答