MySQL为两列选择“不同/唯一”记录

时间:2018-07-11 11:30:59

标签: mysql

我有这张桌子:

id  user    value
1   A       Cool
2   A       Cool
3   A       Cool
2   A       Warm
3   A       Warm
4   B       Cool
5   C       Cool
5   C       Warm

我想在这里得到的记录是“ Cool”的值,并且没有“ Warm”的值。可以通过ID和“用户”列进行标识。

我试图做这样的事情:

SELECT DISTINCT id, user FROM log_table where value= 'Cool'

但这仍将返回也具有“温暖”的记录

预期输出为:

id  user    value
1   A       Cool
4   B       Cool

我在Distinct上发现的另一个问题是,它不允许我添加*,或者由于尝试错误,所以我不怎么做。我也可以在不同之后添加concat吗?没有在独特功能中对其进行处理?

我在这里可能错误地使用了Distinct。

2 个答案:

答案 0 :(得分:1)

您可以将条件汇总用于预期结果

select id, user 
from log_table 
group by id, user 
having count(case when value= 'Cool' then 1 else null end) > 0
and  count(case when value= 'Warm' then 1 else null end) = 0

Demo

或者您可以使用exists

select id, user 
from log_table a
where a.value = 'Cool'
and not exists (
  select 1
  from log_table
  where a.id = id and a.user = user
  and value= 'Warm'
)

Demo

答案 1 :(得分:1)

请考虑以下内容:

SELECT * 
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.id = x.id 
   AND y.user = x.user 
   AND y.value = 'warm' 
 WHERE x.value = 'cool';
+----+------+-------+------+------+-------+
| id | user | value | id   | user | value |
+----+------+-------+------+------+-------+
|  1 | A    | Cool  | NULL | NULL | NULL  |
|  2 | A    | Cool  |    2 | A    | Warm  |
|  3 | A    | Cool  |    3 | A    | Warm  |
|  4 | B    | Cool  | NULL | NULL | NULL  |
|  5 | C    | Cool  |    5 | C    | Warm  |
+----+------+-------+------+------+-------+

我将剩下的问题留给读者练习。