MySQL: Устанавливать значение, только если значение в другом столбце является уникальным - PullRequest
0 голосов
/ 25 мая 2018

Я хочу 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 голосов
/ 25 мая 2018

Попробуйте условное обновление, например:

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
0 голосов
/ 25 мая 2018

Предложение 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_value не является уникальным, поэтому вместо того, чтобы устанавливать 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
0 голосов
/ 25 мая 2018

Пожалуйста, попробуйте вот так-

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