繁体   English   中英

比较同一列中的两个值

[英]Compare Two Values in Same Column

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

ID  Cat     Color
======================
1   red     maroon
2   red     orange
3   red     pink
4   blue    violet
5   blue    purple
6   blue    indigo
7   green   puke green
8   green   hunter green

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

到目前为止,我有以下SQL但它并不是我正在寻找的,特别是对于限制1.我正在寻找单个查询来返回Cat字段而不使用限制1。

SELECT Cat
From foo
WHERE 
Color = 'maroon'
and
Color = 'orange'
LIMIT 1

你可以试试这个:

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

除了初学者的答案 ,没有GROUP_CONCAT可以解决这个问题:

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

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

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

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和更具体的位置。

使用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;

您需要在表的主键(也称为自联接)上自己加入表。

试试这个:

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM