Таблица "допуска к чату": id | id_login | id_chat | 1 | 1 | 2 2 | 2 | 2 3 | 1 | 4 4 | 2 | 50 5 | 3 | 19 6 | 1 | 15 7 | 1 | 33 Каждый пользователь может иметь доступ к многим чатам. Допустим, что я авторизован под пользователем с id_login 1. И хочу переписываться в чате с персонажем id_login 2. Нужно найти чат, к которому мы оба прикреплены. В этом примере у пользователя 1 и 2 общий id_chat это 2. В общем у двух конкретных пользователей нужно найти общее поле id_chat. Как это сделать?
Выбираю все чаты (id_chat) у пользователя 1 в массив. Всё в это в цикл и в цикле делаю запросы с поиском этих чатов у пользователя 2. Если чат у пользователя 2 найдется, то останавливаю цикл. PHP: $array = select("SELECT `id_chat` FROM `table` WHERE `id_login` = 1", 'array'); foreach($array as $value) { $key_chat = select("SELECT `id` FROM `table` WHERE `id_login` = 2 AND `id_chat` = ".$value['id_chat'], 'result'); if($key_chat > 0) break; }
абсолютно неверный подход select distint id_chat from table where id_login in (1,2) ежели найдено юзеры в чате (результатом запроса будет айдишник чата), нет, нет их в одном чате
Не работает(( Этот запрос находит у обоих пользователей в каких они комнатах ещё и с другими пользователями. Т.е если допустим любой из этих двух пользователей сидит ещё одновременно в других чатах с другими пользователями, то все повторяющиеся комнаты и будут выведены. Вот пример: Код (Text): CREATE TABLE IF NOT EXISTS `msg_dostup` ( `id` mediumint(8) unsigned NOT NULL, `id_login` mediumint(8) unsigned NOT NULL, `id_perep` mediumint(8) unsigned NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; INSERT INTO `msg_dostup` (`id`, `id_login`, `id_perep`) VALUES (3, 11, 2), (4, 9, 2), (5, 11, 3), (6, 12, 3); SELECT DISTINCT(`id_perep`) FROM `msg_dostup2` WHERE `id_login` IN(9,11) Из примера выше видно, что пользователь 11 сидит в комнате 2 с пользователем 9 и одновременно сидит в комнате 3 с пользователем 12. А мне нужно проверить только пользователей 9 и 11, сидят ли они вместе или нет. Уже замучался(
Скорее всего надо БД переделывать. --- Добавлено --- Вот. С пылу с жару, только сегодня утром придумал (уверен, что не первым придумал): Спойлер: Переписки Выспался и всё придумал Создаешь три таблицы. 1. переписки --- | id_переписки | id_инициатора_переписки | ну и дальше сам смотри. Темы, даты, хераты, как сам хочешь... 2. участники переписки --- | id_записи | id_переписки | id_участника | 3. сообщения --- | id_сообщения | текст сообщения | id_автора | id_переписки | Вытягиваешь все переписки, в которых участвует пользователь, если надо, вытягиваешь инфу о самих переписках и вытягиваешь все сообщения этих переписок. Логика, думаю, ясна... Плюс этой схемы в том, что у тебя нет ограничений на количество участников переписки.
И тут надо подумать, как код устроить, чтобы не сильно часто БД дергать... ))) надо значит учить устройство БД Автор, в MS Office есть MS Access. Вот там поковыряйся, там наглядно видно как таблицы и связи между ними устроенны.
О, Боже... Вместо помощи человек начал говорить, что я виноват и не так составил БД, таблицу. Сформулирован вопрос правильно. В первом сообщении об этом было указано, что каждый пользователь может быть во многих чатах. Если у тебя своих знаний не хватило на решение этой задачи, то значит это твои проблемы, а не проблемы бд или таблицы. Решение нашел на просторах интернета долго гуглив. Код (Text): SELECT `id_perep` FROM `msg_dostup` WHERE `id_login` IN(11,9) GROUP BY `id_perep` HAVING COUNT(*) > 1
Ну ни кто не говорил, что ты прям виноват. И помогать тебе ни кто не должен и не обязан, мой эгоцентричный друг.
@faerkot я, точно так же как и ты, многих вещей не знаю и сижу тут, чтобы высказывать своё мнение по поводу вопросов других людей, и если я не прав, то меня с большой долей вероятности поправят более опытные товарищи. То, что я тебе что-то предложил - тебя ни к чему не обязывает. Кроме того, я не высказывал в твой адрес никакого негатива. Поэтому делай как считаешь нужным. Мне вообще откровенно всё равно как ты это сделаешь. Я тут мозги тренирую.