За последние 24 часа нас посетили 53368 программистов и 1715 роботов. Сейчас ищут 952 программиста ...

Найти общее поле по условию

Тема в разделе "PHP и базы данных", создана пользователем faerkot, 2 фев 2017.

  1. faerkot

    faerkot Активный пользователь

    С нами с:
    24 май 2016
    Сообщения:
    18
    Симпатии:
    1
    Адрес:
    Иркутск
    Таблица "допуска к чату":
    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.
    Как это сделать?
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    А как пробовал это сделать?
     
  3. faerkot

    faerkot Активный пользователь

    С нами с:
    24 май 2016
    Сообщения:
    18
    Симпатии:
    1
    Адрес:
    Иркутск
    Выбираю все чаты (id_chat) у пользователя 1 в массив.
    Всё в это в цикл и в цикле делаю запросы с поиском этих чатов у пользователя 2.
    Если чат у пользователя 2 найдется, то останавливаю цикл.
    PHP:
    1. $array = select("SELECT `id_chat` FROM `table` WHERE `id_login` = 1", 'array');
    2.  
    3. foreach($array as $value) {
    4. $key_chat = select("SELECT `id` FROM `table` WHERE `id_login` = 2 AND `id_chat` = ".$value['id_chat'], 'result');
    5. if($key_chat > 0) break;
    6. }
     
  4. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    абсолютно неверный подход

    select distint id_chat from table where id_login in (1,2)

    ежели найдено юзеры в чате (результатом запроса будет айдишник чата), нет, нет их в одном чате
     
  5. faerkot

    faerkot Активный пользователь

    С нами с:
    24 май 2016
    Сообщения:
    18
    Симпатии:
    1
    Адрес:
    Иркутск
    Не работает((
    Этот запрос находит у обоих пользователей в каких они комнатах ещё и с другими пользователями. Т.е если допустим любой из этих двух пользователей сидит ещё одновременно в других чатах с другими пользователями, то все повторяющиеся комнаты и будут выведены.
    Вот пример:
    Код (Text):
    1. CREATE TABLE IF NOT EXISTS `msg_dostup` (
    2. `id` mediumint(8) unsigned NOT NULL,
    3.   `id_login` mediumint(8) unsigned NOT NULL,
    4.   `id_perep` mediumint(8) unsigned NOT NULL
    5. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
    6.  
    7. INSERT INTO `msg_dostup` (`id`, `id_login`, `id_perep`) VALUES
    8. (3, 11, 2),
    9. (4, 9, 2),
    10. (5, 11, 3),
    11. (6, 12, 3);
    12.  
    13. SELECT DISTINCT(`id_perep`) FROM `msg_dostup2` WHERE `id_login` IN(9,11)
    Из примера выше видно, что пользователь 11 сидит в комнате 2 с пользователем 9 и одновременно сидит в комнате 3 с пользователем 12. А мне нужно проверить только пользователей 9 и 11, сидят ли они вместе или нет. Уже замучался(
     
  6. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    научись тогда формулировать задачу, потом приходи

    для этой формулировки ответ тебе дан 100%-й
     
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Скорее всего надо БД переделывать.
    --- Добавлено ---
    Вот. С пылу с жару, только сегодня утром придумал (уверен, что не первым придумал):
    Выспался и всё придумал :)
    Создаешь три таблицы.
    1. переписки --- | id_переписки | id_инициатора_переписки | ну и дальше сам смотри. Темы, даты, хераты, как сам хочешь...
    2. участники переписки --- | id_записи | id_переписки | id_участника |
    3. сообщения --- | id_сообщения | текст сообщения | id_автора | id_переписки |

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

    Логика, думаю, ясна...

    Плюс этой схемы в том, что у тебя нет ограничений на количество участников переписки.
     
  8. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    @TeslaFeo тут тело от одной таблицы не знает чего хочет, ты ему три втюхиваешь
     
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    И тут надо подумать, как код устроить, чтобы не сильно часто БД дергать...

    )))

    надо значит учить устройство БД

    Автор, в MS Office есть MS Access. Вот там поковыряйся, там наглядно видно как таблицы и связи между ними устроенны.
     
  10. faerkot

    faerkot Активный пользователь

    С нами с:
    24 май 2016
    Сообщения:
    18
    Симпатии:
    1
    Адрес:
    Иркутск
    О, Боже... Вместо помощи человек начал говорить, что я виноват и не так составил БД, таблицу.
    Сформулирован вопрос правильно. В первом сообщении об этом было указано, что каждый пользователь может быть во многих чатах.
    Если у тебя своих знаний не хватило на решение этой задачи, то значит это твои проблемы, а не проблемы бд или таблицы.
    Решение нашел на просторах интернета долго гуглив.
    Код (Text):
    1. SELECT `id_perep` FROM `msg_dostup` WHERE `id_login` IN(11,9) GROUP BY `id_perep` HAVING COUNT(*) > 1
     
  11. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Ну ни кто не говорил, что ты прям виноват. И помогать тебе ни кто не должен и не обязан, мой эгоцентричный друг.
     
  12. faerkot

    faerkot Активный пользователь

    С нами с:
    24 май 2016
    Сообщения:
    18
    Симпатии:
    1
    Адрес:
    Иркутск
    Никто и не говорил, что кто-то кому-то обязан или должен помогать.
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @faerkot я, точно так же как и ты, многих вещей не знаю и сижу тут, чтобы высказывать своё мнение по поводу вопросов других людей, и если я не прав, то меня с большой долей вероятности поправят более опытные товарищи. То, что я тебе что-то предложил - тебя ни к чему не обязывает. Кроме того, я не высказывал в твой адрес никакого негатива. Поэтому делай как считаешь нужным.
    Мне вообще откровенно всё равно как ты это сделаешь. Я тут мозги тренирую.