SQL:选择仅与一个值相关联的东西

时间:2013-09-11 09:36:40

标签: sql

好的,所以我正在尝试编写一个只返回重复值的查询,如果它们在同一列中并与一个特定值相关联。

例如说,数据库中有5个苹果,但其中1个与“红色”关联,而另一个为“绿色”,在选择只有一个关联的水果的查询中,不会返回任何苹果。但是,如果另一个数据库中有4个苹果,并且所有这些苹果只与“红色”相关联,那么所有这些苹果都会在选择只有一个关联的水果的查询中返回。假设只有2个不同的值,红色和绿色。

所以我的查询看起来像这样:

SELECT Apples
FROM Fruits
WHERE Colour = 'RED' AND Colour NOT IN (SELECT Apples FROM Fruits WHERE Colour =    'GREEN')

我的查询没有运行或返回我需要的结果,我如何返回仅与单个值相关联的值?

任何人都可以帮忙吗?

编辑:好吧我没有使用有效的类比,我只是想获得只与一个值相关的值。检查我的评论,看看我用过的更好的比喻

1 个答案:

答案 0 :(得分:1)

我希望我能正确理解你的问题,你想要一份所有水果(具有相同名称/头衔)的清单,只要它只有一种颜色,否则你的结果中不需要。

使用子查询看起来有点脏,但是我能在短时间内得到最好的结果:

使用此表结构:

CREATE TABLE Fruits (Id INT PRIMARY KEY auto_increment, Title VARCHAR(63), Colour VARCHAR(63));

INSERT INTO Fruits (Title, Colour)
  SELECT 'Apple', 'Green'
  UNION ALL
  SELECT 'Apple', 'Green'
  UNION ALL
  SELECT 'Apple', 'Blue'
  UNION
  SELECT 'Orange', 'Yellow'
  UNION ALL
  SELECT 'Orange', 'Yellow';

您可以执行此查询

SELECT
    Id
  FROM Fruits AS OuterFruits
  WHERE
    Title = 'Orange'
    AND
    (
      SELECT
          COUNT(Colour)
         FROM Fruits AS InnerFruits
         WHERE
          InnerFruits.Colour != OuterFruits.Colour
          AND InnerFruits.Title = OuterFruits.Title
    ) = 0;

这将为插入的两个橙色的行添加,如果您在最后一个查询中将'Orange'替换为'Apple',则会得到一个空的结果集,因为苹果有不同的颜色可用。

您也可以在此fiddle在线尝试。

请注意,这是mysql-syntax(因为你没有包含任何特殊的sql版本,但我非常确定只有auto_increment是特定于mysql的)

相关问题