Python SQLAlchemy получает совпадающую строку и следующую строку, где столбец совпадает - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть таблица, которая выглядит так:

+----------+----------+-------------+
| id       | name     | date        |   
+----------+----------+-------------+
| 1        | John     | 2018-08-21  |
+----------+----------+-------------+
| 2        | James    | 2018-08-22  |
+----------+----------+-------------+
| 3        | John     | 2018-08-22  |
+----------+----------+-------------+
| 4        | Paul     | 2018-08-23  |
+----------+----------+-------------+

Я ищу запрос, который, когда вы выберете id = 1, вернет:

+----------+----------+-------------+
| id       | name     | date        |   
+----------+----------+-------------+
| 1        | John     | 2018-08-21  |
+----------+----------+-------------+
| 3        | John     | 2018-08-22  |
+----------+----------+-------------+

но при выборе id = 2 вы получите:

+----------+----------+-------------+
| id       | name     | date        |   
+----------+----------+-------------+
| 2        | James    | 2018-08-22  |
+----------+----------+-------------+

Другими словами, запрос должен вернуть соответствующую строку на id и следующую строку, в которой имя совпадает.

Я бы сделал это в sqlalchemy. Вся помощь оценена.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Было бы намного проще дать ответ, увидев вашу попытку.Ниже приведен фрагмент кода, который может помочь вам понять

subquery = session.query(Person.name.label('name')).subquery()
main_query = session.query(Person).join(subquery, Person.name==subquery.c.name).filter(Person.id==2).\
order_by(Person.id).limit(2)

Гораздо более понятный подход предполагает два запроса

get_name = session.query(Person).filter(Person.id==1).first()[0]
get_all_rows =session.query(Person).filter(Person.name==get_name).order_by(Person.id).limit(2)
0 голосов
/ 10 сентября 2018

Для работы с реляционной базой данных нужно понимать, что нет следующей строки, нет предустановленного порядка.Вам нужно запросить определенный заказ путем сортировки, а затем получить столько записей в этом порядке, сколько вам нужно.

В этом случае вы используете, например, .filter(the_table.c.name == "John"), затем .order_by("id", "name"), затем .limit(2).Если вы выбрали две строки, то было две записи, которые соответствуют вашему ограничению.Не может быть никаких записей или только одна запись.

Все становится сложнее, если у вас есть несколько наборов записей для Джона, и вы хотите определенную подпоследовательность.Для этого вы можете добавить условие типа the_table.c.id >= certain_id или что-то подобное для даты.

Как правило, в вашей модели данных отсутствует явный способ связать несколько записей в одну последовательность.У вас нет «идентификатора последовательности», «идентификатора предыдущей записи» или чего-то подобного, что помогло бы увидеть несколько записей как связанные.Возможно, вы можете использовать для этого столбец отметки времени, , если , то это соответствует вашей проблеме;вполне вероятно, что нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...