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

时间:2018-05-25 16:37:35

标签: mysql sql datagrip

我希望SET在一列中将布尔值设置为True,但前提是相邻列中的值是唯一的(无论该值是什么)。

假设ROOM_IS_PRIVATE是我设置的布尔列,ROOM_VALUE是我想要检查其唯一性值的列。我写新查询相当新,所以这就是我到目前为止所做的:

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

但这不适合我。我是否使用计数功能在正确的轨道上?

编辑:以下是我希望实现的结果示例:

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

如果第一列中的值对该列唯一,则第二列仅变为1

3 个答案:

答案 0 :(得分:1)

请尝试这样 -

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

答案 1 :(得分:1)

尝试这样的条件更新:

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

答案 2 :(得分:1)

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子句中,我们使用的是一个测试计数的表达式,并有条件地指定1cnt=1时),否则保留room_is_private的值不变。

我怀疑当room_value不是唯一的时候我们可能也想设置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