Как найти людей в базе данных, которые живут в тех же городах? - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в SQL, и я прошу помощи в по-видимому простом вопросе, но он становится громоздким в моей памяти.

У меня есть следующая таблица:

ID   NAME   CITY
---------------------
1    John   new york
2    Sam    new york
3    Tom    boston
4    Bob    boston
5    Jan    chicago
6    Ted    san francisco
7    Kat    boston

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

Ответ для таблицы, которую я показал выше, будет:

ID   NAME   CITY
---------------------
1    John   new york
2    Sam    new york
3    Tom    boston
4    Bob    boston
7    Kat    boston

Ответы [ 6 ]

0 голосов
/ 15 ноября 2018

Это просто аромат, отличающийся от других опубликованных.

 SELECT     ID,
            name,
            city
 FROM       (SELECT     DISTINCT
                        ID,
                        name,
                        city,
                        COUNT(1) OVER (PARTITION BY city) AS cityCount
             FROM       table) t
 WHERE      cityCount > 1
0 голосов
/ 15 ноября 2018
This can be expressed many ways.  Here is one possible way:

select * from persons p
where exists (
    select 1 from persons p2
    where p2.city = p.city and p2.name <> p.name
)
0 голосов
/ 15 ноября 2018

Чтобы избежать коррелированного подзапроса, который приводит к вложенному циклу, вы можете выполнить самостоятельное соединение:

SELECT id, name, city
FROM persons
   JOIN (SELECT city
         FROM persons
         GROUP BY city HAVING count(*) > 1) AS cities
      USING (city);

Возможно, это наиболее эффективное решение.

0 голосов
/ 15 ноября 2018

Я бы использовал EXISTS:

SELECT t.*
FROM table t
WHERE EXISTS (SELECT 1 FROM table t1 WHERE t1.city = t.city AND t1.name <> t.name);
0 голосов
/ 15 ноября 2018

Это даст вам строки, которые имеют один и тот же город более 1 раза:

SELECT persons.*
FROM persons
WHERE (SELECT COUNT(*) FROM persons AS p GROUP BY CITY HAVING p.CITY = persons.CITY) > 1
0 голосов
/ 15 ноября 2018

Это действительно вопрос из двух частей:

  1. В каких городах проживает более одного пользователя?
  2. Какие пользователи живут в этом подмножестве городов?

Давайте ответим на это в двух частях.Давайте также сделаем упрощенное предположение (не указано в вашем вопросе), что таблица «Пользователи» имеет только одну запись на пользователя на город.

Чтобы найти города с более чем одним пользователем:

 SELECT City FROM Users GROUP BY City HAVING COUNT(*) > 1

Теперь давайте найдем всех пользователей для этих городов:

SELECT ID, User, City FROM Users 
   WHERE City IN (SELECT City FROM Users GROUP BY CITY HAVING COUNT(*) > 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...