igorbelikov
@igorbelikov
Fullstack Developer

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

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

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

Или может это можно как-то красиво вывести с помощью ar yii?
  • Вопрос задан
  • 2804 просмотра
Решения вопроса 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-а. Единственное, стоит проверить на запросе с отсутствием разговоров между пользователями.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы