Если юзер 1 пишет юзеру 2 и между ними уже есть диалог, то сообщение просто добавляется к диалогу. Я же на схеме всё показал, там добавлены сообщения. В самом сообщении есть только sender_id, больше мне ничего не нужно, ясно же, что если диалог между двумя пользователями, то если sender_id не равно текущему пользователю, то это сообщение текущего пользователя. Я как раз от этой всей мороки и хотел уйти, с user_from, user_to и т.д. При удалении диалога - ну удалить диалог и все его сообщения, а в чём проблема-то?
@mkramer пример посмотрел и не понял не много зачем у вас столько много таблиц, объясните пожалуйста. Я базу у себя переделывать буду, тоже хочу избавиться от этот писанины user_form user_for.
Где много? Всего на одну больше, чем у тебя. dialog_user - связующая таблица для организации many-to-many между dialog и user. Вообще, если введение новой таблицы упростит мне запросы, я ввожу новую таблицу. МОжно тогда не диалог удалять, а только ссылку в dialog_user
@mkramer Я распишу для начала, чтобы понять твою структуру: 1. таблица user ты там хранишь user_id, login, pass и т. д. 2. таблица dialog просто хранишь id диалога то есть если появляется новый диалог то туда записывается новый id диалог 1, 2, 3 и т. д. 3. таблица dialog_user ты хранишь как раз user_id из таблицы user и dialog_id из таблицы dialog 4. таблица message тут не понял, id номер сообщения dialog_id если я понял ты его берешь из таблицы dialog то есть имеет связь с ней sender_id это что отправитель? text и time понятно сообщение и время. Все ли я правильно понял?
sender - да, это отправитель. Получатель нас обычно не сильно интересует. Ну в реальных проектах я в dialog храню чуть больше (время последнего сообщения можно туда писать, само последнее сообщение, количество сообщений и т.п. - для ускорения поиска, так называемое денормирование), но да, не суть. В таблице dialog_user я связываю с диалогом всех его участников
прям как в ВК типа когда открываешь диалог там последнее сообщения показывает) понятно, надо мне переделать свои таблицы и писать менее запросы, а то у меня их дофига.
Нет, он просто не будет получать новых сообщений и не будет видеть этого диалога у себя. А его сообщения с его id же останутся, в поле sender_id --- Добавлено --- Вообще, я не так много проектов с диалогами делаю, но почти сразу пришёл к этой схеме, удобно.
@mkramer @igordata построил новую структуру для диалогов и сообщений. вот ссылка http://sqlfiddle.com/#!9/ee29c8/3 теперь бы разобраться как же в том онлайн инструменте работать как можно написать сообщения если там условия нельзя делать, только работа с бд.
@igordata понял мне надо сперва вставить записи а потом аж делать конкретный запрос из вставленных записей?
Эта штука только для sql, не для того, чтобы исполнять целые программы. Вот теперь ты можешь там пробовать запросы, которые тебе здесь дают, или которые сам придумал, или спрашивать, почему что-то не выходит, и мы будем видеть, что конкретно. Сообщения, если нужны, добавь руками. По структуре - ну всё ясно, кроме того, зачем тебе в dialogs user_id, ну я не настаиваю что не нужен, мне просто не очевидно, зачем. Если ты сам понимаешь, зачем - ну ОК, пусть будет.
@mkramer не ну я так понял и в dialogs и в dialog_user нужно хранить user_id если нет то исправлю. Или хватит dialog_user что я там храню и юзера ID и диалога ID???
Мне не было нужно. Тебе - не знаю, смотря с какой целью ты используешь. Надо же что-то делать не потому что @mkramer или @igordata написали тебе на форуме, что так надо делать. Надо отдавать себе отчёт, зачем и почему ты так делаешь. Вот как ты будешь использовать user_id из dialogs? Он может быть нужен, если тебе очень надо знать инициатора диалога. Мне в проектах было по-барабану, кто диалог начал, не попадалось. Кстати, ты связи-то понимаешь? Чем отличается один-ко-многим от многие-ко-многим? И почему для диалогов я предложил именно многие-ко-многим?
@mkramer Примерно понимаю связи, когда то проходили. Но объяснить можешь если не сложно, так еще под учу за одно, ну или на мануал кинь где принципы эти объясняют. И еще в таблице dialog_user мне нужно поле id, просто я его поставил! К стати вот новая ссылка на таблицы мои с полями http://sqlfiddle.com/#!9/1e9323/1 по рекомендуйте что можно убрать еще...
Вот это точно - нахрена? Эта таблица сама по себе почти не используется, любая её строка однозначно определяется сочетанием user_id и dialog_id, по которым, кстати, можно поставить уникальный ключ, чтоб быстрее были выборки, ну и чтоб мы случайно не записали несколько строк. Я вообще не понимаю дурацкую манеру везде id пихать, где надо и где нет. Код (Text): SELECT `ds`.* FROM `dialogs` ds JOIN `dialog_user` du ON (ds.id = du.dialog_id) WHERE du.user_id = du.id; Чувак, ну это же бред... Вот расскажи словами этот запрос, что он делает... https://habrahabr.ru/post/193380/
@mkramer я же уточнил нужен ли мне id в этой таблице dialog_user, вот ты и помог мне убрал сразу. на счет запроса я его не правильно сделал я знаю) в конце мне не надо было выборку такую делать WHERE du.user_id = dialog_id; или так WHERE du.user_id = 1; подставляя номер id диалога как в твоем примере А так запрос вытягивает все данные из таблицы dialog_user Спасибо за мануал описание прикольное)))
Где твоя логика? Если тебе надо выбрать диалоги конкретного юзера, то надо сравнить user_id. Где оно у нас хранится? В dialog_user.user_id. Значит, ты правильно сделал join в этой таблице. Теперь осталось правильно сделать условие - чтоб user_id был нужного нам пользователя. Всё Включай голову. Вообще не представляю, как ты вышку, физику и прочие профилирующие предметы сдавать умудряешься --- Добавлено --- Все данные из неё вытягивает запрос Код (Text): select * from dialog_user;
@mkramer у меня оценки по этим предметам нормальные вроде! И с логикой у меня проблема. Делаю методом исключения запросы