igorbelikov
@igorbelikov
Fullstack Developer

Проблема с нужной выборкой

Возможно из-за того, что уже глубокая ночь, но жестко туплю.
Имеется таблица такого вида:
ee69b0889c1d4b34a4e95cbec1b80e58.PNG
Это таблица, которая хранит пользователей диалогов.

Соответственно еще существует таблица:
диалогов (id);
сообщений (id | user_id | dialog_id | content);
пользователей (id | name).
Мне требуется сделать проверку на существование диалога между двумя пользователями, мол существует ли диалог между пользователем_1 и пользователем_2.

Или может это можно как-то красиво вывести с помощью ar yii?
  • Вопрос задан
  • 2781 просмотр
Решения вопроса 2
  • @0LLEGator
    "Начинающий" программист в средней компании.
    Можно соорудить простой запрос для подсчёта количества разговоров
    SELECT ifnull(COUNT ( `dl2`.`dialog_id`),0) AS ` dialog_count`
    FROM `dialog_relations` AS `dl1`
    INNER JOIN `dialog_relations`  AS `dl2` USING(`dialog_id`)
    WHERE `dl1`.`user_id` = @user1 AND `dl2`.`user_id` = @user2

    Но в приведённой вами схеме данных такой запрос может завышать количество разговоров, если они есть. Если совпадений нет, то они не появятся. Чтобы этот запрос работал корректно, рекомендую в первой таблице вместо искусственного PK в виде id записи сделать составной PK состоящий из ID разговора и ID участника, тогда он будет отражать суть и предохранять от дублирования записей.

    Для конкретно вашего случая правильно считать количество будет запрос
    SELECT ifnull(COUNT (DISTINCT `dl2`.`dialog_id`),0) AS ` dialog_count`
    FROM `dialog_relations` AS `dl1`
    INNER JOIN `dialog_relations`  AS `dl2` USING(`dialog_id`)
    WHERE `dl1`.`user_id` = @user1 AND `dl2`.`user_id` = @user2


    Чтобы лишь определить наличие разговоров можно сделать "красивее"
    SELECT ifnull(COUNT (DISTINCT `dl2`.`user_id`),0) AS ` dialog_count`
    FROM `dialog_relations` AS `dl1`
    INNER JOIN `dialog_relations`  AS `dl2` USING(`dialog_id`)
    WHERE `dl1`.`user_id` = @user1 AND `dl2`.`user_id` = @user2

    тут 0 - нет диалогов, 1 - есть диалоги.

    P.S. Справедливости ради хочу отметить, что без ifnull'а должно подойти для запроса @akashtrih-а. Единственное, стоит проверить на запросе с отсутствием разговоров между пользователями.
    Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Вакансии с Моего Круга Все вакансии
Заказы с Фрилансим Все заказы