MySQL выбирает с соединениями с внешними ключами при использовании предоставленного идентификатора - PullRequest
1 голос
/ 20 марта 2011

Кроме того, если это не то место, я перенесу его в переполнение стека.Я разместил это здесь, так как, когда у меня там был вопрос о mysql, они сказали, что именно здесь следует задавать такие вопросы.

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

схема таблицы выглядит примерно так:

chat(
id int unsigned not null,
sayer_id int unsigned not null,
message_type tinyint unsigned not null,
message varchar(150) not null,
timesent timestamp on update current_timestamp,
);

индексы на id и timesent.Основным является id, а также нормальный индекс на timesent.Вторая таблица просто.

chat_private(
message_id int unsigned not null,
target_id int unsigned not null
)

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

Теперь запрос, который я пытаюсь сделать, выглядит примерно так: SELECT message, timesent FROM chat WHERE timesent>=last_update AND target_id=$userid; last_update - переменная сеансауказав, когда в последний раз были выполнены обновления.$ userid - это идентификатор переменной сеанса на стороне сервера.Также я не знаю, как легко сделать что-то похожее на это, так как я хочу получить соединение из таблицы chat_private, но я также не хочу иметь дело со всеми идентификаторами из него, так как он содержит толькоtarget_id / message_id и, следовательно, будет довольно бессмысленным.

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

1 Ответ

2 голосов
/ 20 марта 2011

Вы хотите что-то вроде

SELECT chat.message, chat.timesent FROM chat LEFT JOIN chat_private ON chat.id=chat_private.message_id WHERE chat.timesent>='$timestamp' AND chat_private.target_id=$target_id
...