Python peewee: Как выбрать отдельные значения в одном столбце перед объединением? - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь присоединиться ко второй таблице (PageLikes) в первой таблице (PageVisits) после выбора только отдельных значений в одном столбце первой таблицы с помощью python ORM.

В чистом виде SQL Я могу сделать это:

SELECT DISTINCT(pagevisits.visitor_id), pagelikes.liked_item FROM pagevisits
INNER JOIN pagelikes on pagevisits.visitor_id = pagelikes.user_id

В peewee с python Я попытался:

query = (Page.select(
         fn.Distinct(Pagevisits.visitor_id),
         PageLikes.liked_item)
         .join(PageLIkes)

Это дает мне ошибку: distinct() takes 1 positional argument but 2 were given

Единственный способ, которым я могу и использовал отличное с peewee, выглядит следующим образом:

query = (Page.select(
         Pagevisits.visitor_id,
         PageLikes.liked_item)
         .distinct()

, который, кажется, не работает для моего сценария.

Так, как я могу выбрать только разные значения в одной таблице на основе одного столбца, прежде чем присоединиться к другой таблице с peewee?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Не думаю, что вы должны столкнуться с ошибкой, используя fn.DISTINCT() таким образом. Мне любопытно увидеть полный след. При локальном тестировании у меня нет проблем с запуском чего-то вроде:

query = (PageVisits
         .select(fn.DISTINCT(PageVisits.visitor_id), PageLikes.liked_item)
         .join(PageLikes))

, что дает SQL эквивалентно тому, что вы ищете. Я использую последний код peewee между прочим.

0 голосов
/ 03 апреля 2020

Как и Papooch , вызов функции Different для модели выглядит следующим образом:

distinct_visitors = (Pagevisits
                            .select(
                                Pagevisits.visitor_id.distinct().alias("visitor")
                            )
                            .where(Pagevisits.page_id == "Some specifc page")
                            .alias('distinct_visitors')
                            )


query = (Pagelikes
         .select(fn.Count(Pagelikes.liked_item),
         )
         .join(distinct_visitors, on=(distinct_visitors.c.visitor = Pagelikes.user_id))
         .group_by(Pagelikes.liked_item)
         )
...