Вопрос Mysql If

#php #mysql #sql

#php #mysql #sql

Вопрос:

Я создаю окно обмена мгновенными сообщениями.
У меня есть таблица, которую я хочу обновить, если пользователь закроет окно, что означает, что он просмотрел сообщения, которые отправил ему его друг.
Когда это происходит, у каждого разговора есть уникальный идентификатор, поэтому я нахожу сообщения с этим идентификатором и устанавливаю столбец просмотренных равным имени пользователя.

Однако, если другой пользователь также закроет окно, я хотел бы изменить просмотренный столбец на ‘both’ для всех сообщений, чтобы ни одно из этих сообщений не появлялось ни для одного пользователя. (по умолчанию просмотренный столбец равен 0).
Что я хочу, так это запрос, который просто находит все сообщения с convo_id , и если это сообщение уже просмотрено другим пользователем, то это означает, что viewed!=0 тогда для него установлено значение оба, иначе для него устанавливается значение пользователь, закрывающий окно.

У меня есть запрос, но он не работает, потому что я не совсем правильно понял синтаксис.

Просто интересно, может ли кто-нибудь исправить это или предложить что-нибудь.

 $sql = "UPDATE chatbox IF (viewed!=?) THEN
        SET viewed=? WHERE convo_id=?
        ELSE 
        SET viewed=? WHERE convo_id=?";
$stmt18 = $conn->prepare($sql);
$result = $stmt18->execute(array(0,$receiver,$convo_id,'both',$convo_id));
  

Комментарии:

1. Почему бы просто не сгенерировать два разных оператора UPDATE в вашем PHP-коде?

2. Какой SQL вы используете?

3. @AJ: Предположительно, потому что для выполнения всегда требовалось бы два оператора SQL. Один должен выяснить, какой из них запускать, а другой — запустить его. Также это условие гонки.

Ответ №1:

вы захотите использовать оператор case:

 update catbox
set viewed = case when viewed = ? THEN ? else ? end
where convo_id = ?
  

Комментарии:

1. Это работает, Пол, я действительно ценю это, однако, что вы думаете о том, что Джордж сказал о простом создании отдельной таблицы?

Ответ №2:

Я предлагаю вам создать вторую таблицу (возможно, называемую ‘views’) для записи этой информации. Когда происходит событие закрытия, вы вставляете строку в таблицу с идентификатором сообщения и именем пользователя.

Это должно упростить запрос и избежать создания запутанных данных в таблице сообщений.

Комментарии:

1. Это хороший момент, я всегда просто думал, что добавление другого столбца лучше, чем создание полной таблицы. Я несколько параноик по поводу пространства, ха-ха.

2. Если ваш новый столбец будет содержать уникальную часть данных, вы правы. Однако, поскольку для определения того, что должно быть помещено в поле, требуется логика, вам лучше создать отдельную таблицу. Это также позволит вашему приложению масштабироваться — что произойдет в вашем текущем сценарии, если вы решите поддерживать более двух пользователей в каждом чате?

3. Еще раз спасибо, Джордж, снова хороший момент. На самом деле у меня есть другие таблицы для других видов новых сообщений и уведомлений. Может быть, я смогу их объединить.