MYSQL Получить каждый первый идентификатор уникальных IP-адресов

У меня есть таблица, в которой есть столбец с идентификаторами и столбец с IP-адресами. В таблице есть другая информация, но для этой проблемы я фокусируюсь только на IP-адресах.

Мне нужно выяснить каждое первое вхождение IP-адреса в таблице и вернуть номер идентификатора.

Есть много подобных вопросов, но все они — более старые вопросы, и их ответы, кажется, не работают по какой-то причине.

Вот пример таблицы:

+----+-----------------+
| id | ip              |
+----+-----------------+
|   1| 123.45.67.89    |
|   2| 123.45.67.89    |
|   3|  98.76.54.32    |
|   4| 123.45.67.89    |
|   5|  98.76.54.32    |
|   6|  11.22.33.44    |
+----+-----------------+

Результат, который я хочу получить: (может иметь столбец ip, если это необходимо):

+----+
| id |
+----+
|   1|
|   3|
|   6|
+----+

Но я либо получаю все результаты обратно, либо получаю последнее удостоверение личности: 4,5,6

Что я пробовал:

SELECT DISTINCT(`ip`), `id`
FROM `MyTable`
ORDER BY `id` ASC
-- this gives all rows.

SELECT `id`
FROM `MyTable`
GROUP BY `ip`
ORDER BY `id` ASC
-- this works but seems to completely ignore the ORDER BY statement, I get the last id, instead of first.

SELECT `ip` FROM
(   SELECT `ip`
FROM `MyTable`
ORDER BY `id` ASC
) as rows
GROUP BY `ip`
-- the id is not specified here and as such not returned.

SELECT `ip`, `id` FROM
(   SELECT `ip`, `id`
FROM `MyTable`
ORDER BY `id` ASC
) as rows
GROUP BY ip
-- finds the uniques, but again does not sort, so instead returns the last occurence, not the first.

Как я могу заставить это работать в 2017 году?

0

Решение

это сработало для меня:

select id from MyTable group by ip order by id

Если у вас действительно есть проблемы с заказом, попробуйте это:

select id from
(SELECT id
FROM MyTable
GROUP BY ip) tmpTable order by id

Если это не работает, значит, что-то не так с определением таблицы. Попробуйте опубликовать свой оператор создания и любые операторы создания индекса.

Кроме того, моя таблица использует движок InnoDB. Какой двигатель вы используете? Другие могут ответить по-другому.

0

Другие решения

Сделайте само присоединение, чтобы получить первое вхождение ip

select a.*
from demo a
left join demo b on a.ip = b.ip
and a.id > b.id
where b.id is null

демонстрация

2

select `id`
from (
select * from `MyTable` order by `id` ASC
) x
group by `ip`

Может быть, так?

0

Если в вашей таблице IP-адресов нет больше столбцов, просто используйте это:

select distinct(*) from `myTable`
0
По вопросам рекламы [email protected]