简单的MySQL查询帮助:如何获取具有一个字段值而不是另一个字段值的所有用户

时间:2012-11-06 16:40:05

标签: mysql

在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';
)

我也非常满意这样一个查询,它返回了所有喜欢橙子但不喜欢香蕉或香蕉而不是橙子的人。我不知道哪个查询会更容易。

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

2 个答案:

答案 0 :(得分:4)

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

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

从内部更好地阅读此查询:

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

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

这是 SQL Fiddle 。这里有很多a helpful article比较(性能方面)实现相同结果的几种方法。

答案 1 :(得分:0)

您也可以尝试以下查询。

  

SELECT Name FROM(SELECT Name,GROUP_CONCAT(Fruit)as Fruits FROM   表GROUP BY名称)t1其中Fruit不喜欢'%HatedFruit%';