Выборка хранилища данных на двух альтернативных фильтрах? - PullRequest
0 голосов
/ 05 марта 2011

У меня есть объект хранилища данных с именем Game и два поля в нем, называемые playerOne и playerTwo.В любом из этих полей хранится имя пользователя.

Мне нужно выполнить поиск по объекту «Игра» и вернуть максимум 30 игр, где в качестве имени пользователя можно указать playerOne или playerTwo ...

Так что вреляционная база данных вы бы пошли: ВЫБРАТЬ * ИЗ игры ГДЕ playerOne = 'username' ИЛИ ​​playerTwo = 'username' LIMIT 30

Но в большой таблице вы не можете фильтровать более чем по одному полю!Я не могу получить 10 от одного и 10 от другого, так как число от каждого может быть переменным и в порядке созданной даты.

Как бы вы сделали это в своем хранилище данных?

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

Быстрый ответ - создать StringListProperty, который содержит [player_a, player_b], а затем просто использовать многозначный индекс, сделанный из этого:

games = Game.all().filter("players =", player_find)
1 голос
/ 05 марта 2011

Вы не можете выполнить ИЛИ запрос к хранилищу данных, используя разные поля. Если вам нужно сохранить текущую модель сущности, вам нужно выполнить два запроса.
1) фильтрация на playerOne и ограничение до 30
2) фильтрация на playerTwo и ограничение (30 - размер результата запроса один)
Затем объедините результаты в памяти, чтобы получить окончательный набор 30.
Теперь, если вы также захотите упорядочить по дате, это станет более сложным. Однако в написанном вами SQL-запросе нет никакого порядка, поэтому я его и опустил.

Однако, если вы можете изменить модель сущности, тогда хорошим способом для достижения желаемого является наличие одного поля, содержащего список обоих имен пользователей.
Затем вы можете сделать простой запрос в стиле:
ВЫБРАТЬ * ИЗ ИГРЫ ГДЕ playerBoth = 'username'

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