【问题标题】:Compare Two Values in Same Column比较同一列中的两个值
【发布时间】:2015-08-23 08:42:39
【问题描述】:

我需要比较单个表中单个列中的值。这是一个示例表:

ID猫颜色 ======================= 1个红栗色 2红橙 3 红色 粉色 4蓝紫罗兰 5蓝紫 6蓝靛蓝 7绿色呕吐绿色 8绿猎人绿

我从颜色列中获得了 2 种颜色。我需要知道它们是否属于同一个 Cat 列。例如,我会得到栗色和橙色。我需要返回红色的值。紫罗兰色和紫色应该返回蓝色。呕吐绿色和紫色应该返回 null。

到目前为止,我有以下 SQL,但这并不是我想要的,尤其是使用 Limit 1。我正在寻找一个查询来返回 Cat 字段而不使用 Limit 1。

选择猫 来自 foo 在哪里 颜色 = '栗色' 和 颜色 = '橙色' 限制 1

【问题讨论】:

  • 如果cats不同,你想要什么结果?如果超过2个?

标签: mysql sql


【解决方案1】:

除了Beginner's answer,没有GROUP_CONCAT也可以解决这个问题:

SELECT cat
FROM foo
WHERE color IN ('maroon', 'orange')
GROUP BY cat
HAVING COUNT(*) = 2
;

这通过选择具有指定颜色的所有猫来起作用。当我们对它们进行分组时,出现多次的猫(HAVING 子句)就是您要保留的记录。

注意:使用HAVING 子句的数字应与您要搜索的颜色数相匹配。

【讨论】:

  • 这个最靠谱。感谢您的帮助。
【解决方案2】:

你可以试试这个:

SELECT x.cat 
FROM (
  SELECT cat, GROUP_CONCAT(color) AS colors
  FROM tablename
  GROUP BY cat) AS x
WHERE FIND_IN_SET('maroon', x.colors) > 0
  AND FIND_IN_SET('orange', x.colors) > 0

编辑 1:另一种选择

SELECT IF(
          FIND_IN_SET('maroon', GROUP_CONCAT(color)) > 0 
          AND FIND_IN_SET('orange', GROUP_CONCAT(color)) > 0 , cat, NULL
       ) AS cat
FROM tablename
GROUP BY cat

【讨论】:

    【解决方案3】:
    DECLARE @Cat varchar(50) = null
    
    select @Cat = Cat
    from foo f1
    JOIN foo f2 on f1.Cat = f2.Cat
    where f1.Color = 'maroon'
    and f2.Color = 'orange'
    
    select @Cat
    

    理想情况下,您应该有一个关联的颜色表,以便您可以执行 JOIN 和更具体的位置。

    【讨论】:

    • 就像提问者的SQL一样,这永远不会返回任何记录。这就像查询 number =1 和 number =2 的位置一样。
    • 不正确,如果有的话,它会返回颜色值为“maroon orange”或“orange maroon”的猫。
    • 很遗憾,我无法更改表的结构。我想要一个更加规范化的表格,但这就是我所拥有的。
    • 桌子没有像我想要的那样出来。栗色、橙色和粉红色都是颜色值。他们的类别是红色的。
    • 请注意您在评论中如何说“或”,但在答案中如何说“与”。
    【解决方案4】:

    使用GROUP BY 子句尝试这样的操作

    select case when count(*) > 0 then cat else NULL end as MyCat_Column
    from (
    select Cat
    from table1
    where color in ('maroon','orange')
    group by cat
    having count(distinct color) >= 2
    ) tab;
    

    【讨论】:

    • 如果类别不相同则需要返回null。在您的情况下,结果为空
    【解决方案5】:

    您需要在表的主键上将表与自身 JOIN(也称为 Self-Join)。

    试试这个:

    SELECT A.Cat
    From foo A, foo B
    WHERE 
    A.ID = B.ID 
    and A.Cat = B.Cat and
    A.Color = 'maroon'
    and
    B.Color = 'orange'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      相关资源
      最近更新 更多