#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. Еще раз спасибо, Джордж, снова хороший момент. На самом деле у меня есть другие таблицы для других видов новых сообщений и уведомлений. Может быть, я смогу их объединить.