igorbelikov
@igorbelikov
Fullstack Developer

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

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

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

Или может это можно как-то красиво вывести с помощью ar yii?
  • Вопрос задан
  • 2801 просмотр
Решения вопроса 2
akashtrih
@akashtrih
Навскидку что-то такое:
SELECT `dl2`.`id` AS `exists`
FROM `dialog_relations` AS `dl`
LEFT JOIN `dialog_relations`  AS `dl2` USING(`dialog_id`)
WHERE `dl`.`user_id` = 1 AND `dl2`.`user_id` = 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
Похожие вопросы
Bezlimit Москва
от 80 000 до 120 000 руб.
Badoo Development Москва
от 140 000 до 180 000 руб.
SaveTime Москва
от 140 000 до 200 000 руб.