MySQL:仅当另一列中的值唯一时才设置值
MySQL: SET a value only if a value in another column is unique
我想 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
。
请这样尝试-
SELECT
ROOM_IS_PRIVATE = CASE WHEN COUNT(ROOM_VALUE) = 1 THEN 1 ELSE 0 END
FROM yourtableName
尝试这样的条件更新:
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
SET
子句看起来是正确的。但这不是一个有效的陈述;看起来我们缺少 UPDATE
关键字,即我们正在更新的 table 的名称。
如果我们只想修改 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
,并将结果具体化为派生的 table。这使我们得到 room_value
的不同值,以及具有相同 room_value
.
的行数
然后我们将派生故事连接回原始 table,匹配 room_value
列,所以现在,对于 table 中的每一行,我们可以知道具有相同 room_value
的行。
在 SET
子句中,我们使用一个表达式来测试计数,并有条件地分配一个 1
(当 cnt=1
时),否则保留 [=23 的值=]不变。
我怀疑我们可能还想在 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
我想 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
。
请这样尝试-
SELECT
ROOM_IS_PRIVATE = CASE WHEN COUNT(ROOM_VALUE) = 1 THEN 1 ELSE 0 END
FROM yourtableName
尝试这样的条件更新:
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
SET
子句看起来是正确的。但这不是一个有效的陈述;看起来我们缺少 UPDATE
关键字,即我们正在更新的 table 的名称。
如果我们只想修改 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
,并将结果具体化为派生的 table。这使我们得到 room_value
的不同值,以及具有相同 room_value
.
然后我们将派生故事连接回原始 table,匹配 room_value
列,所以现在,对于 table 中的每一行,我们可以知道具有相同 room_value
的行。
在 SET
子句中,我们使用一个表达式来测试计数,并有条件地分配一个 1
(当 cnt=1
时),否则保留 [=23 的值=]不变。
我怀疑我们可能还想在 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