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

0

Я хочу, чтобы SET логического значения Правда, в одном столбце, но только если значение в соседнем столбце уникально (независимо от того, что это значения).

Предположим, ROOM_IS_PRIVATE - это логический столбец, который я устанавливаю, и ROOM_VALUE - это столбец, значение которого я хочу проверить на уникальность. Я новичок в написании запросов, поэтому вот что у меня есть до сих пор:

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

Но это не работает для меня. Я даже на правильном пути, используя функцию count?

EDIT: Вот пример результатов, которые я надеюсь достичь:

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

Второй столбец становится только 1 если значение в первом столбце уникально для этого столбца.

  • 0
    Отредактируйте свой вопрос и предоставьте образцы данных и желаемых результатов.
  • 0
    @GordonLinoff Готово, сэр
Показать ещё 1 комментарий
Теги:
datagrip

3 ответа

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 мы используем выражение, которое проверяет счет, и условно назначает 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
    Спасибо, что объяснили это так хорошо. Этот ответ поможет гораздо больше вопросов, которые я буду писать.
  • 0
    @ TomCrews: хорошо иметь представление о шаблонах, полезных инструментах для наших инструментов SQL, поэтому мы можем использовать те же шаблоны в других запросах.
1

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

SELECT 
    ROOM_IS_PRIVATE = CASE WHEN COUNT(ROOM_VALUE) = 1 THEN 1 ELSE 0 END
FROM yourtableName
  • 1
    Этот запрос будет возвращать одну строку ... агрегат подсчета получит нам счетчик количества строк с ненулевым значением для room_value (по сути, один счетчик всех строк в таблице), затем сравнивать с литералом 1, а затем возвращать 1 или 0, затем сравнивать 0 или 1 с неопределенным значением room_is_private , оценивающим, что в логическом контексте он возвращает 0, 1 или NULL. Этот запрос, вероятно, будет выполнен, но я не вижу, как это решает вопрос, заданный OP. Этот ответ, должно быть, был поддержан несгибаемым поклонником для ответов "попробуй это".
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню