Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Добрый день. Извиняюсь за несколько корявое название темы. В общем, вопрос следующий. Предположим, что у нас есть такая таблица: 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 Помогите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:00 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Дык, в FAQ куча примеров: http://www.sql.ru/forum/684431/faq-numeraciya-strok-i-drugie-voprosy-pro-ispolzovanie-peremennyh ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:15 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Спасибо, попытаюсь разобраться, но все же хотелось примера под мой конкретный случай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:30 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
У меня был похожий кейс. Если адаптировать запрос под данный случай, то: Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:35 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
CzaaСпасибо, попытаюсь разобраться, но все же хотелось примера под мой конкретный случай2. пронумеровать записи отдельно для кaждого значения "type" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:35 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:51 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Czaaslawdows, Спасибо, но не совсем то. Таблица получается такого вида Кажется Вы забыли указать первое условие из вложенного запроса: Код: sql 1. Если написать запрос без него, то получится именно так как говорите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:58 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Большое спасибо всем, кто откликнулся. Получилось сделать через переменные. Странно, но способ, предложенный slawdows, у меня не заработал. И ещё почему-то adminer ругался на ключевое слово table после from ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 21:16 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
В моём примере вместо table нужно поставить название Вашей таблицы. Вы так сделали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 21:29 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Czaa, Можно посмотреть получившийся запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 21:32 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
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 только что проверил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:00 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
slawdows, После того, как adminer выдал ошибку я понял, что слово table лишнее. Интересно, почему у нас с Вами разные результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:07 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Czaaslawdows, После того, как adminer выдал ошибку я понял, что слово table лишнее. Интересно, почему у нас с Вами разные результаты. А что у Вас скрывается под SLAVE и MAIN? Какое название у Вашей таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:11 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
CzaaПосле того, как adminer выдал ошибку я понял, что слово table лишнее.Нет, не лишнее. Это имя Вашей таблицы. А SLAVE и MAIN - это её алиасы. Возможно, было бы более понятным использование полного синтаксиса: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:14 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
slawdows, Таблица Slave и Main это две идентичных друг другу таблицы: Id | ФИО | возраст 1| Иванов| 47 1| Иванов| 48 1| Иванов| 49 2 | Петров | 34 2 | Петров | 35 3 | Сидоров | 55 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:19 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Сделал немного по-дургому назвал свою таблицу 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:27 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Czaaно на финальный результат это не повлиялоИ правильно сделало. Потому что Ваш `id` - это какой-то странный айди. Скорее, это какой-то user_id, но уж точно не уникальный идентификатор записи таблицы. Сделаете нормальный id - вероятно, заработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:36 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:49 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Точно, насчёт "вероятно" верно предположил. Заработает относительно правильно, да и то, только в частном случае, когда последовательности id и возраста будут совпадать в их возрастании для каждой фамилии. Если же последовательность будет "плясать", то вот из таких данных (у Иванова нарушена последовательность) Код: sql 1. 2. 3. 4. 5. 6. 7. вот таким запросом Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. получается такой вот результат 1 Иванов 47 1 1 Иванов 49 2 1 Иванов 48 3 2 Петров 34 1 2 Петров 35 2 3 Сидоров 55 1 В общем, тут ещё думать надо. Или принять меры на этапе ввода данных в таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 22:50 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
На этом же наборе данных вариант с переменными Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. возвращает именно желаемый результат Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 23:04 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
vkleполучается такой вот результат 1 Иванов 47 1 1 Иванов 49 2 1 Иванов 48 3 2 Петров 34 1 2 Петров 35 2 3 Сидоров 55 1 В общем, тут ещё думать надо. Или принять меры на этапе ввода данных в таблицу. Так а кажется исходя из ТЗ получается правильный результат, ведь не сказано что Иванов с меньшим возрастом должен быть выше Иванова с большим :) Другим словами строчка Иванов 48 встретилась в 3-ий раз. Czaa, прошу прощения, что не сразу не заметил, что у Вас "не тот" id в таблице )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 23:14 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Так а кажется исходя из ТЗ получается правильный результат, ведь не сказано что Иванов с меньшим возрастом должен быть выше Иванова с большим :) Другим словами строчка Иванов 48 встретилась в 3-ий раз. Совершенно верно, ранжирование по возрасту в данном случае абсолютно не имеет значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 23:25 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Если ещё узнать что по времен быстрее ... ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 23:34 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
Czaaведь не сказано что Иванов с меньшим возрастом должен быть выше Иванова с большим :)Не сказано и обратное, а пример желаемого результата имеется. Тут следует заметить, что такая штука, как "последовательность записей" в таблице - понятие, некоторым образом, мифическое. Да и строчка в ТЗ "который раз по счету нам встретилась строчка с определённым id" никоим образом не говорит, как именно следует считать. Ну и "вишенка на торте" - вариант с переменными не требует добавления в таблицу нового поля. slawdowsЕсли ещё узнать что по времен быстрее ... )Протестируйте на табличке в сотню тысяч или миллион записей. Сдается мне, вариант с двумя селектами потребует создания временной таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 23:55 |
|
||
|
Порядковый номер каждого повтора
|
|||
|---|---|---|---|
|
#18+
vkleНу и "вишенка на торте" - вариант с переменными не требует добавления в таблицу нового поля. Имеется в виду таблица вывода? А ведь тот же самый столбец выводится в обоих случаях, не так ли? vkleПротестируйте на табличке в сотню тысяч или миллион записей. Сдается мне, вариант с двумя селектами потребует создания временной таблицы. Мда, тут опыта конечно побольше нужно) А мне вот что ещё придумалось, вариант с JOIN: Код: sql 1. 2. 3. 4. Такой запрос быстрее отработает чем тот, что с 2-мя СЕЛЕКТами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 00:56 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39420350&tid=1830840]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 380ms |

| 0 / 0 |
