У меня есть таблица, в которой есть столбец с идентификаторами и столбец с 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 году?
это сработало для меня:
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. Какой двигатель вы используете? Другие могут ответить по-другому.
Сделайте само присоединение, чтобы получить первое вхождение 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
select `id`
from (
select * from `MyTable` order by `id` ASC
) x
group by `ip`
Может быть, так?
Если в вашей таблице IP-адресов нет больше столбцов, просто используйте это:
select distinct(*) from `myTable`