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-а. Единственное, стоит проверить на запросе с отсутствием разговоров между пользователями.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ITGLOBAL.COM Севастополь
от 120 000 до 200 000 руб.
Fmedia Санкт-Петербург
от 60 000 руб.
Alma Innovation Group Алматы
от 50 000 до 90 000 руб.