Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: связь многие ко многим, поиск id беседы содержащей только двух указанных пользователей

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
gin101
Отправлено: 19 Июля, 2015 - 19:01:06
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2015  


Помог: 0 раз(а)




имеется таблица которая реализует связь многие ко многим

dialogue_id | user_id

dialogue_id - id диалога
user_id - id пользователя который находится в диалоге

вопрос: как зная id двух пользователей найти id диалога в котором находятся только два этих пользователя и никого больше?

хотелось бы все это реализовать на sql без использования php
 
 Top
Ts.Saltan
Отправлено: 19 Июля, 2015 - 20:55:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


Помог: 22 раз(а)




может так?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `dialogue_id` FROM `anytable` WHERE `user_id` = ID_1 OR `user_id` = ID_2 HAVING COUNT(`dialogue_id`) = 2
 
 Top
gin101
Отправлено: 19 Июля, 2015 - 22:06:34
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2015  


Помог: 0 раз(а)




Ts.Saltan пишет:
может так?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `dialogue_id` FROM `anytable` WHERE `user_id` = ID_1 OR `user_id` = ID_2 HAVING COUNT(`dialogue_id`) = 2


выдает пустой результат, функция count работает по другому, она подсчитывает количество записей в таблице, тоесть такой запрос вернет результат только тогда когда по условию в нем будет выбрано 2 строки, видимо так

видимо все-таки лучшим вариантом будет выбрать все беседы для двух пользователей, а потом используя php найти необходимую, иначе я никак не могу придумать :С
 
 Top
Мелкий Супермодератор
Отправлено: 19 Июля, 2015 - 22:18:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Один маленький момент пропущен - группировка
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `dialogue_id` FROM `anytable` WHERE `user_id` = ID_1 OR `user_id` = ID_2
  2. GROUP BY `dialogue_id`
  3. HAVING COUNT(0) = 2


-----
PostgreSQL DBA
 
 Top
gin101
Отправлено: 19 Июля, 2015 - 22:59:39
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2015  


Помог: 0 раз(а)




Мелкий пишет:
Один маленький момент пропущен - группировка
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `dialogue_id` FROM `anytable` WHERE `user_id` = ID_1 OR `user_id` = ID_2
  2. GROUP BY `dialogue_id`
  3. HAVING COUNT(0) = 2


это уже ближе, но запрос так же выводит диалоги в которых помимо указанных пользователей присутствуют еще и другие

для наглядности прикрепил картинку с исходной таблицей и той что выдает ваш запрос, красным обвел то что не должно было выводиться, а синим то что должно, сорри за пайнт
Прикреплено изображение (Нажмите для увеличения)
table.jpg
 
 Top
Мелкий Супермодератор
Отправлено: 19 Июля, 2015 - 23:42:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Да, резонно. Этот запрос для поиска диалогов, в которых оба пользователя участвуют. Туплю уже, спать пойду.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `dialogue_id` FROM `tablename`
  2. JOIN (SELECT DISTINCT dialogue_id FROM `anytable` WHERE `user_id` = ID_1 OR `user_id` = ID_2 ) usersdialogs USING(dialogue_id)
  3. GROUP BY `dialogue_id`
  4. HAVING COUNT(0) = 2

Как вот так должно получиться вычитать все диалоги, в которых засветились эти юзера, затем пересчитать количество участников всего в этих диалогах и отфильтровать те, в которых всего два участника - это нужные двое и будут.


-----
PostgreSQL DBA
 
 Top
gin101
Отправлено: 21 Июля, 2015 - 19:14:40
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2015  


Помог: 0 раз(а)




спасибо, все заработало)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB