Нужно что-то похожее на DISTINCT ON (a) и DISTINCT ON (b), где обычное предложение DISTINCT не работает - PullRequest
0 голосов
/ 02 октября 2018

Так же, как предисловие, я попытался использовать SELECT DISTINCT ON(a, b) и SELECT DISTICNT ON (a) ... UNION SELECT DISTINCT ON (b), но ни один из них не сработал, поэтому я ищу возможное решение.

У меня есть два стола, игрок и карта (карта представляет собой что-то вроде контракта наемного убийцы со ссылкой на «убийцу» и «жертву», которые ссылаются на стол игрока).

Когда убийца успешно убивает жертву, состояние жертвы устанавливается на'dead', и их карта освобождается (путем установки для killer_id карты значения NULL), вводя своего рода "пул свободных карт".Затем убийца устанавливается в режим ожидания (как в ожидании новой карты, которая будет ему назначена), а его теперь заполненная карта устанавливается в состояние завершения.

Я пытаюсь назначить режим ожидания.Карты игроков из пула освобожденных карт с дополнительным предупреждением о том, что игрок никогда не сможет получить себя в качестве цели, т.е. СОЕДИНЕНИЕ card.victim_id ON player.id не допускается.Выполнение:

SELECT c.id AS card_id, p.id AS player_id 
FROM card c
FULL OUTER JOIN player p ON true
WHERE p.state = 'idle'
  AND c.killer_id IS NULL
  AND c.victim_id != p.id;

возвращает все возможные комбинации карт и игроков.Однако мне нужно, чтобы каждая карта и каждый игрок были уникально объединены, то есть каждая карта назначена игроку, а каждому игроку назначена карта, в которой в предыдущем ряду не было ни card_id, ни player_id. Я создал скрипту БД, чтобы проиллюстрировать свою точку зрения. .

Итак, с учетом вышеприведенного запроса, скажем, я получил следующий набор данных:

|   card_id   |   player_id   |
|-------------|---------------|
|      2      |       1       |
|      4      |       1       |
|      2      |       3       |
|      4      |       3       |

Я хочусвяжите его с одним из следующих:

|   card_id   |   player_id   |      |   card_id   |   player_id   |
|-------------|---------------|  OR  |-------------|---------------|
|      2      |       1       |      |      2      |       3       |
|      4      |       3       |      |      4      |       1       |

, где нет ни одного повторяющегося значения ни для одного из столбцов, но фактическая комбинация card_id и самого player_id не имеет значения.

Как указаноРаньше я пытался использовать SELECT DISTINCT ON(card_id, player_id) и SELECT DISTICNT ON (card_id) ... UNION SELECT DISTINCT ON (player_id), но ни один из них не работал.

Любая помощь будет высоко ценится!

...