Возможно из-за того, что уже глубокая ночь, но жестко туплю.
Имеется таблица такого вида:
Это таблица, которая хранит пользователей диалогов.
Соответственно еще существует таблица:
диалогов (id);
сообщений (id | user_id | dialog_id | content);
пользователей (id | name).
Мне требуется сделать проверку на существование диалога между двумя пользователями, мол существует ли диалог между пользователем_1 и пользователем_2.
Или может это можно как-то красиво вывести с помощью ar yii?
1
Сортировать по:
Ответы (2)
1
Навскидку что-то такое:
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
1
Можно соорудить простой запрос для подсчёта количества разговоров
Но в приведённой вами схеме данных такой запрос может завышать количество разговоров, если они есть. Если совпадений нет, то они не появятся. Чтобы этот запрос работал корректно, рекомендую в первой таблице вместо искусственного PK в виде id записи сделать составной PK состоящий из ID разговора и ID участника, тогда он будет отражать суть и предохранять от дублирования записей.
Для конкретно вашего случая правильно считать количество будет запрос
Чтобы лишь определить наличие разговоров можно сделать "красивее"
тут 0 - нет диалогов, 1 - есть диалоги.
P.S. Справедливости ради хочу отметить, что без ifnull'а должно подойти для запроса @akashtrih-а. Единственное, стоит проверить на запросе с отсутствием разговоров между пользователями.
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-а. Единственное, стоит проверить на запросе с отсутствием разговоров между пользователями.
Написать ответ