Так же, как предисловие, я попытался использовать 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)
, но ни один из них не работал.
Любая помощь будет высоко ценится!