But you say that "tiles" and "word (score)" are unrelated and this does not seem true to me:For each move id aka "mid" there is a JSON value, describing how the player played the letter tiles.And for the same "mid" there is a list of one or more "word (score)"s achieved...
For each mid you want to know all tiles played and all word scores achieved - but you want to forget/ignore that a given tile achieved a given word score. IOW, you are intentionally forgetting/ignoring the fact that the tiles and the corresponding word scores are related to each other, beyond the simple/incomplete relationship that both share the same mid. You thus need to write a query that only relates tiles and word scores to mid and not to each other.
Maybe it is possible to GROUP BY tiles somehow or some kind of special SQL JOIN?
I do not know if the tables or columns below match your model but the concept should still come across intact.
SELECT mid,
(SELECT string_agg(tiles, '; ') FROM tiles WHERE ta.mid = moves.mid) AS mid_tiles,
(SELECT string_agg(words, '; ') FROM words WHERE words.mid = moves.mid) AS mid_words
FROM moves
There are other ways to write that that could perform better but the idea holds.
David J.