powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядковый номер каждого повтора
27 сообщений из 27, показаны все 2 страниц
Порядковый номер каждого повтора
    #39420284
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Извиняюсь за несколько корявое название темы.

В общем, вопрос следующий. Предположим, что у нас есть такая таблица:

Id | ФИО | возраст
1| Иванов| 47
1| Иванов| 48
1| Иванов| 49
2 | Петров | 34
2 | Петров | 35
3 | Сидоров | 55

Вопрос следующий: возможно ли с помощью запроса получить выборку следующего вида?

Id | ФИО | возраст | порядковый номер повтора
1| Иванов| 47 | 1
1| Иванов| 48 | 2
1| Иванов| 49 | 3
2 | Петров | 34 | 1
2 | Петров | 35 | 2
3 | Сидоров | 55 | 1

Таким образом, последний столбец нам показывает, который раз по счету нам встретилась строчка с определённым id

Помогите, пожалуйста.
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420287
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420295
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, попытаюсь разобраться, но все же хотелось примера под мой конкретный случай
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420302
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня был похожий кейс. Если адаптировать запрос под данный случай, то:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT id, `ФИО`, `возраст`,
	(SELECT COUNT(id)
	FROM table `SLAVE`
	WHERE `SLAVE`.id <= MAIN.id AND `SLAVE`.`ФИО`=MAIN.`ФИО`
	)
FROM table MAIN
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420303
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CzaaСпасибо, попытаюсь разобраться, но все же хотелось примера под мой конкретный случай2. пронумеровать записи отдельно для кaждого значения "type"
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420316
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
slawdows,

Спасибо, но не совсем то. Таблица получается такого вида


id ФИО возраст Q
1 Иванов 55 3
1 Иванов 58 3
1 Иванов 60 3
2 Петров 45 2
2 Петров 46 2
3 Сидоров 22 1

Т.е. в последнем столбце просто дублируется count по id, а хотелось бы так:


id ФИО возраст Q
1 Иванов 55 1
1 Иванов 58 2
1 Иванов 60 3
2 Петров 45 1
2 Петров 46 2
3 Сидоров 22 1
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420320
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Czaaslawdows,

Спасибо, но не совсем то. Таблица получается такого вида

Кажется Вы забыли указать первое условие из вложенного запроса:
Код: sql
1.
WHERE `SLAVE`.id <= MAIN.id


Если написать запрос без него, то получится именно так как говорите.
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420328
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо всем, кто откликнулся.

Получилось сделать через переменные.

Странно, но способ, предложенный slawdows, у меня не заработал. И ещё почему-то adminer ругался на ключевое слово table после from
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420331
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В моём примере вместо table нужно поставить название Вашей таблицы. Вы так сделали?
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420333
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Czaa,

Можно посмотреть получившийся запрос?
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420341
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
slawdows,

Запрос вот такой

SELECT id, `ФИО`, `возраст`,
(SELECT COUNT(id)
FROM SLAVE
WHERE `SLAVE`.id <= MAIN.id AND `SLAVE`.`ФИО`=MAIN.`ФИО`
)
FROM MAIN

А результат вот такой


id ФИО возраст q
1 Иванов 55 3
1 Иванов 58 3
1 Иванов 60 3
2 Петров 45 2
2 Петров 46 2
3 Сидоров 22 1

только что проверил
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420345
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
slawdows,

После того, как adminer выдал ошибку я понял, что слово table лишнее.

Интересно, почему у нас с Вами разные результаты.
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420350
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Czaaslawdows,

После того, как adminer выдал ошибку я понял, что слово table лишнее.

Интересно, почему у нас с Вами разные результаты.
А что у Вас скрывается под SLAVE и MAIN?
Какое название у Вашей таблицы?
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420352
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CzaaПосле того, как adminer выдал ошибку я понял, что слово table лишнее.Нет, не лишнее. Это имя Вашей таблицы. А SLAVE и MAIN - это её алиасы.
Возможно, было бы более понятным использование полного синтаксиса:
Код: sql
1.
FROM `table` AS `SLAVE`
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420354
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
slawdows,

Таблица Slave и Main это две идентичных друг другу таблицы:

Id | ФИО | возраст
1| Иванов| 47
1| Иванов| 48
1| Иванов| 49
2 | Петров | 34
2 | Петров | 35
3 | Сидоров | 55
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420359
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал немного по-дургому назвал свою таблицу m, а main и slave сделал ее алиасами (спасибо vkle за подсказку) а не как поначалу, когда я копировал одну таблицу, но на финальный результат это не повлияло

SELECT id, `ФИО`, `возраст`,
(SELECT COUNT(id)
FROM m as SLAVE
WHERE `SLAVE`.id <= MAIN.id AND `SLAVE`.`ФИО`=MAIN.`ФИО`
) q
FROM m as MAIN


id ФИО возраст q
1 Иванов 55 3
1 Иванов 58 3
1 Иванов 60 3
2 Петров 45 2
2 Петров 46 2
3 Сидоров 22 1
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420363
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Czaaно на финальный результат это не повлиялоИ правильно сделало. Потому что Ваш `id` - это какой-то странный айди. Скорее, это какой-то user_id, но уж точно не уникальный идентификатор записи таблицы.
Сделаете нормальный id - вероятно, заработает.
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420365
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,

Да, Вы абсолютно правы. Добавил уникальное значение и всё заработало. Спасибо

SELECT un, id, `ФИО`, `возраст`,
(SELECT COUNT(id)
FROM m as Slave
WHERE `Slave`.un <= MAIN.un AND `Slave`.`ФИО`=MAIN.`ФИО`
) q
FROM m as MAIN


un id ФИО возраст q
1 1 Иванов 55 1
2 1 Иванов 58 2
3 1 Иванов 60 3
4 2 Петров 45 1
5 2 Петров 46 2
6 3 Сидоров 22 1
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420366
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно, насчёт "вероятно" верно предположил. Заработает относительно правильно, да и то, только в частном случае, когда последовательности id и возраста будут совпадать в их возрастании для каждой фамилии.

Если же последовательность будет "плясать", то вот из таких данных (у Иванова нарушена последовательность)
Код: sql
1.
2.
3.
4.
5.
6.
7.
INSERT INTO `tbl` (`id`, `uid`, `fio`, `age`) VALUES
(1, 1, 'Иванов', 47),
(2, 2, 'Петров', 34),
(3, 3, 'Сидоров', 55),
(4, 2, 'Петров', 35),
(5, 1, 'Иванов', 49),
(6, 1, 'Иванов', 48);


вот таким запросом
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
    `uid`, 
    `fio`, 
    `age`, 
    (
        SELECT 
        	COUNT(1) 
        FROM `tbl` AS `slave` 
        WHERE `slave`.`id`<=`main`.`id` AND `slave`.`uid`=`main`.`uid`
    ) AS `q`
FROM 
	`tbl` AS `main`
ORDER BY 
	`uid`,`q`


получается такой вот результат
1 Иванов 47 1
1 Иванов 49 2
1 Иванов 48 3
2 Петров 34 1
2 Петров 35 2
3 Сидоров 55 1

В общем, тут ещё думать надо. Или принять меры на этапе ввода данных в таблицу.
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420373
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этом же наборе данных вариант с переменными
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
    `uid`, 
    `fio`, 
    `age`, 
    IF(@uid = `uid`,
       @rownum := @rownum + 1,
       @rownum :=1 + least(0, @uid := `uid`)
    ) AS `q`
FROM 
	`tbl`,
    (SELECT @rownum := 1, @uid := '_') AS `z`
ORDER BY 
	`uid`,`age`


возвращает именно желаемый результат
Код: sql
1.
2.
3.
4.
5.
6.
1 	Иванов 	47 	1
1 	Иванов 	48 	2
1 	Иванов 	49 	3
2 	Петров 	34 	1
2 	Петров 	35 	2
3 	Сидоров 	55 	1
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420379
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleполучается такой вот результат
1 Иванов 47 1
1 Иванов 49 2
1 Иванов 48 3
2 Петров 34 1
2 Петров 35 2
3 Сидоров 55 1

В общем, тут ещё думать надо. Или принять меры на этапе ввода данных в таблицу.
Так а кажется исходя из ТЗ получается правильный результат, ведь не сказано что Иванов с меньшим возрастом должен быть выше Иванова с большим :) Другим словами строчка Иванов 48 встретилась в 3-ий раз.

Czaa,

прошу прощения, что не сразу не заметил, что у Вас "не тот" id в таблице ))
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420383
Czaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так а кажется исходя из ТЗ получается правильный результат, ведь не сказано что Иванов с меньшим возрастом должен быть выше Иванова с большим :) Другим словами строчка Иванов 48 встретилась в 3-ий раз.

Совершенно верно, ранжирование по возрасту в данном случае абсолютно не имеет значения
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420387
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если ещё узнать что по времен быстрее ... )
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420391
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Czaaведь не сказано что Иванов с меньшим возрастом должен быть выше Иванова с большим :)Не сказано и обратное, а пример желаемого результата имеется. Тут следует заметить, что такая штука, как "последовательность записей" в таблице - понятие, некоторым образом, мифическое. Да и строчка в ТЗ "который раз по счету нам встретилась строчка с определённым id" никоим образом не говорит, как именно следует считать.
Ну и "вишенка на торте" - вариант с переменными не требует добавления в таблицу нового поля.


slawdowsЕсли ещё узнать что по времен быстрее ... )Протестируйте на табличке в сотню тысяч или миллион записей. Сдается мне, вариант с двумя селектами потребует создания временной таблицы.
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420403
slawdows
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleНу и "вишенка на торте" - вариант с переменными не требует добавления в таблицу нового поля.
Имеется в виду таблица вывода? А ведь тот же самый столбец выводится в обоих случаях, не так ли?

vkleПротестируйте на табличке в сотню тысяч или миллион записей. Сдается мне, вариант с двумя селектами потребует создания временной таблицы.
Мда, тут опыта конечно побольше нужно)

А мне вот что ещё придумалось, вариант с JOIN:
Код: sql
1.
2.
3.
4.
SELECT `SLAVE`.`fio`, `SLAVE`.age, COUNT(`SLAVE`.`fio`)
FROM tbl AS MAIN
   LEFT JOIN tbl AS `SLAVE` ON `SLAVE`.`uid`=MAIN.`uid` AND `SLAVE`.id>=MAIN.id
GROUP BY `SLAVE`.`uid`, `SLAVE`.price



Такой запрос быстрее отработает чем тот, что с 2-мя СЕЛЕКТами?
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420410
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slawdowsvkleНу и "вишенка на торте" - вариант с переменными не требует добавления в таблицу нового поля.
Имеется в виду таблица вывода?Имеется в виду вот этоCzaaДобавил уникальное значение и всё заработало.добавление столбца с уникальным id строки в исходную таблицу.


slawdowsА мне вот что ещё придумалось, вариант с JOIN:
Код: sql
1.
2.
3.
4.
SELECT `SLAVE`.`fio`, `SLAVE`.age, COUNT(`SLAVE`.`fio`)
FROM tbl AS MAIN
   LEFT JOIN tbl AS `SLAVE` ON `SLAVE`.`uid`=MAIN.`uid` AND `SLAVE`.id>=MAIN.id
GROUP BY `SLAVE`.`uid`, `SLAVE`.price




Такой запрос быстрее отработает чем тот, что с 2-мя СЕЛЕКТами?Говорят, что использование JOIN более правильно, чем WHERE. По моему соображению, оно, как минимум, лучше отображает логику построения запроса. А вот условия и сам факт связывания таблиц для данного простейшего случая останутся одинаковыми. Чтобы говорить о "медленнее или быстрее", сперва нужно увидеть предпосылки для этого.

Посмотрите планы того и другого вариантов. Для этого следует добавить слово EXPLAIN перед текстом запроса. Если надумаете выложить сюда результаты, то покажите сразу и SHOW CREATE TABLE структуру таблицы.
...
Рейтинг: 0 / 0
Порядковый номер каждого повтора
    #39420415
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slawdowsЕсли ещё узнать что по времен быстрее ... )


...только експерименты... за глаза никто не скажет...
зависит от количества строчек, кардиналити (рамера груп),
от количества оперативки, от фаз луны, и т.д....
... на переменных, обычно быстро,
но если свалится из памяти на диск, то будет очень долго...
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядковый номер каждого повтора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]