MySQL Алгоритм запроса - я перегружен - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть 2 разные таблицы. Моя цель - найти людей, которые используют один и тот же IP-адрес с разными именами и именами.

Table 2 - members
id    name    surname
87    john    but
88    john    but
89    alex    lopez
90    david   beckham

Table 1 - logs
member_id   ip_adress
87          1.1.1.1
88          1.1.1.1
89          2.2.2.2
90          2.2.2.2

Результат, который я хочу получить

ip_address  members   count
2.2.2.2     89,90     total (2 )

Я пытался в течение нескольких дней Мы не могли решить. В результате мне нужно получить вышеуказанный вывод.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Добро пожаловать в S / O, и у вас есть хороший вопрос, запутывающий несколько, но вы привели хороший пример, что вы не хотите IP, если это было то же имя / фамилия. Чтобы получить то, что вы ищете, вам нужно самостоятельно присоединиться к той же таблице журналов, но и к тем же таблицам участников, чтобы у вас была возможность сопоставления сначала по IP, а затем сравнили имя / фамилию каждого человека, чтобы они могут быть исключены, если это необходимо.

Это не идеально, но это действительно то, что вы ищете по образцам данных, без специальной фильтрации по одному IP-адресу.

select
        l1.ip_address,
        group_concat(distinct l1.member_id order by l1.member_id ) UniqueMembers,
        count(*) NumberOfMembers
    from
        logs l1
            JOIN members m1
                on l1.member_id = m1.id
            join logs l2
                on l1.ip_address = l2.ip_address
                AND l1.member_id != l2.member_id
                join members m2
                    on l2.member_id = m2.id
                        AND m1.name != m2.name
                        AND m1.surname != m2.surname
group by
    l1.ip_address

Я используя l1 и l2 для соответствующих псевдонимов «Logs» и m1 и m2 для «членов». Итак, я начинаю с того же ID члена от l1 до m1. Затем из первой таблицы журнала во вторую на основе IP-адреса и должен быть другой идентификатор участника (зачем сравнивать одного и того же человека по одному и тому же идентификатору участника). Теперь я могу присоединиться к l2 и m2 по его идентификатору участника и исключить его, если имена m1 и m2 совпадают, поскольку имеют право на! = Для имени и фамилии.

Должно значительно приблизить вас к тому, что вы ищете.

0 голосов
/ 18 апреля 2020

Вот SQLFiddle для вашей схемы с запросом.

Схема

CREATE TABLE members (
  id INT NOT NULL PRIMARY KEY,
  name VARCHAR(20),
  surname VARCHAR(20)
  );

CREATE TABLE logs (
  member_id INT NOT NULL,
  ip_address VARCHAR(15)
  );

INSERT INTO members VALUES
( 87, "John", "But"),
( 88, "John", "But"),
( 89, "Alex", "Lopez"),
( 90, "David", "Beckham");

INSERT INTO logs VALUES
( 87, "1.1.1.1"),
( 88, "1.1.1.1"),
( 89, "2.2.2.2"),
( 90, "2.2.2.2");

Запрос

SELECT ip_address,
  GROUP_CONCAT(member_id) as member_ids, 
  count(*) as total 
FROM logs
WHERE ip_address = "2.2.2.2"
GROUP BY ip_address;

И результаты

ip_address  member_ids  total
2.2.2.2     89,90       2
...