0

MySQL 非常糟糕,因为我只在 oracle dbs 上完成了轻量级的网页设计和 SQL。假设我有一张桌子,列出了人们喜欢的所有水果。

name   fruit
------------
john   bananas
john   oranges
marcy  bananas
dave   oranges
lucy   bananas
lucy   oranges

假设我想获取所有喜欢橙子但没有具体说明他们是否喜欢香蕉的人的名字。这张表中只有两种可能的水果。(它可能会扩展到更多,但通常只有两个)。

查询会是什么?我想要一个只返回“dave”的查询,因为 marcy 只指定了她喜欢香蕉,而 john 和 lucy 说他们都喜欢。我认为我不需要加入,因为这只是一张桌子。

我正在努力

select name from table
where(--uhm.. use the stuff below somehow
select name from table
where fruit like 'bananas';
select name from table
where fruit like 'oranges';
)

如果一个查询返回所有喜欢橙子但不喜欢香蕉,或喜欢香蕉但不喜欢橙子的人,我也会非常高兴。我不知道哪个查询会更容易。

此外,我确信我能够在互联网上找到其他有同样问题的人。你会在谷歌上使用什么查询来回答我的问题?

4

2 回答 2

4

我想这应该可以解决问题:

SELECT DISTINCT name 
  FROM fruits
 WHERE fruit = 'likedFruit'
   AND name NOT IN (
     SELECT name 
       FROM fruits
      WHERE fruit = 'hatedFruit');

最好从内部读取此查询:

  • 首先(使用NOT IN嵌套查询)你收集不喜欢某些特定水果的人的所有名字(我们称他们为“水果仇恨者”)
  • 然后,对于每一行,您都检查该行是否存储有关某些好水果的数据,如果是,则该行中的名称属性是否不是这些讨厌的“水果仇恨者”中的一个。

我们必须在这里使用嵌套查询或连接,因为单行没有关于某人最喜欢的水果的所有信息。而且,实际上,DISTINCT在这种特殊情况下不需要 - 但如果(name, fruit)组合不是,它将很有用UNIQUE

这是可以使用的SQL Fiddle。这是一篇非常有用的文章,比较(性能方面)实现相同结果的几种方法。

于 2012-11-06T16:44:23.063 回答
0

您也可以尝试以下查询。

SELECT Name FROM (SELECT Name, GROUP_CONCAT(Fruit) as Fruits FROM Table GROUP BY Name) t1 where Fruits not like '%HatedFruit%';

于 2012-11-06T17:33:43.087 回答