MySQL выберите, где значение имеет несколько значений в других строках

#mysql #select #rows

#mysql #выберите #строки

Вопрос:

Прежде всего, я прошу прощения, если этот вопрос задавался раньше, я действительно пытался искать, но не смог найти то, что искал.

Итак, это моя таблица. Я хочу иметь запрос, в котором я выбираю идентификаторы пользователей, которые имеют одинаковое точное значение более 2 раз.

 | USER ID|COLOR|
---------|-------
| 1      | BLUE
| 2      | BLUE
| 3      | RED
| 4      | BLUE
  

Поэтому мой запрос в этом случае вернет

 | USER ID|
|--------|
| 1      |
| 2      |
| 4      |
  

Большое вам спасибо!

Ответ №1:

Кажется, вы хотите выбрать строки, где color повторяется более двух раз. Вот один из методов:

 select t.*
from t join
     (select color, count(*) as cnt
      from t
      group by color
     ) tt
     on tt.color = t.color and cnt > 2;
  

Вы запросили более 2 совпадений. Для 2 или более совпадений вы должны использовать решение sgeddes:

 select t.*
from t
where exists (select 1
              from t tt
              where t.color = tt.color and t.userid <> tt.userid
             );
  

Или, если вам просто нужны несколько идентификаторов:

 select color, group_concat(userid)
from t
group by color
having count(*) >= 2;
  

Комментарии:

1. Чтобы добавить, я буду искать в таблице с 140 тыс. строк. Я хочу получить идентификатор пользователя для людей, у которых точно такой же IP-адрес. Я собираюсь попробовать это сейчас, заранее спасибо.

Ответ №2:

Вот один из вариантов, использующий exists :

 select userid
from yourtable t
where exists (
   select 1
   from yourtable t2
   where t.userid <> t2.userid and t.color = t2.color
)
  

Комментарии:

1. ОП запрашивал «более 2 раз», а не «2 или более раз».

2. @GordonLinoff — отличная точка зрения, я не осознавал этого при публикации. Ваш ответ будет обрабатывать> 2, это будет обрабатывать> 1. Предполагая, что OP хочет> 2, я удалю этот ответ…

3. . . ОП кажется запутанным.