mysql:仅当另一列中的值是唯一的时才设置值

mrphzbgm  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(370)

我想 SET 一列中的布尔值为true,但前提是相邻列中的值是唯一的(无论该值是什么)。
假设 ROOM_IS_PRIVATE 是我正在设置的布尔列,并且 ROOM_VALUE 要检查其值的唯一性的列。我对编写查询还比较陌生,所以到目前为止我掌握了以下内容:

SET ROOM_IS_PRIVATE = '1'
WHERE COUNT(ROOM_VALUE) = 1;

但这对我没用。我使用count函数是否正确?
编辑:以下是我希望达到的结果示例:

|  ROOM_VALUE  |  ROOM_IS_PRIVATE  |
|--------------|-------------------|
|      54      |         0         |
|      13      |         1         |
|      08      |         0         |
|      08      |         0         |
|      54      |         0         |
|      19      |         1         |
|      08      |         0         |

第二列只会变成 1 如果第一列中的值对于该列是唯一的。

t40tm48m

t40tm48m1#

请这样试试-

SELECT 
    ROOM_IS_PRIVATE = CASE WHEN COUNT(ROOM_VALUE) = 1 THEN 1 ELSE 0 END
FROM yourtableName
iugsix8n

iugsix8n2#

这个 SET 条款看起来是对的。但这不是一个有效的声明;看来我们错过了 UPDATE 关键字,我们要更新的表的名称。
如果我们只想修改 room_value 是独一无二的,我们可以这样做:

UPDATE mytable t
  JOIN ( SELECT r.room_value
              , COUNT(*) AS cnt
           FROM mytable r
          GROUP BY r.room_value
       ) s
    ON s.room_value = t.room_value 
   SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE t.room_is_private END

内联视图 s 并将结果具体化为派生表。这给我们带来了不同的价值观 room_value ,以及具有相同 room_value .
然后我们将派生的故事连接回原始表,匹配 room_value 列,所以现在,对于表中的每一行,我们可以知道具有相同 room_value .
SET 子句中,我们使用一个表达式来测试计数,并有条件地指定 1 (何时 cnt=1 )否则会留下 room_is_private 不变。
我想我们可能也想 room_is_private =0,当房间值不唯一时,所以不设置 room_is_private 对于当前值(即保持不变),我们将改为指定 0 .

UPDATE mytable t
  JOIN ( SELECT r.room_value
              , COUNT(*) AS cnt
           FROM mytable r
          GROUP BY r.room_value
       ) s
    ON s.room_value = t.room_value 
   SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE 0 END
0md85ypi

0md85ypi3#

尝试以下条件更新:

update a set 
a.ROOM_IS_PRIVATE= case when cnt is null then 1 else 
a.ROOM_IS_PRIVATE end 
from yourtable a  
left join(
select roomvalue, count(*) cnt
from yourtable
group by roomvalue
having count(*)>1 )b
on a.roomvalue=b.roomvalue

相关问题