Tengo un par de mesas.

Tabla 1 (player_main)

Esta tabla tiene una columna "id" que es un tipo UUID y es la clave principal.

Tabla 2 (game_main)

Esta tabla también tiene una columna "id" del tipo UUID y es una clave principal.

Tabla 3 (game_members) Esta tabla tiene una columna "member_id" de tipo UUID que es una clave principal y una referencia externa a player_main (id). También hay una columna "game_id" de tipo UUID que hace referencia a game_main (id).

Mi problema es que si un jugador se conecta al servidor, quiero poder cargar sus "datos del juego" consultando la base de datos y recibiendo todos los datos para construir su objeto de datos. Me dan el UUID del jugador que está almacenado en player_main (id). Necesito obtener el game_main (id) y una lista de todos los ID de miembros del juego que corresponden a ese game_main (id).

¿Cómo haría esto? Intenté hacer diferentes tipos de uniones con una cláusula where para identificar los game_members (member_id) pero eso solo devuelve la fila correspondiente al miembro que acaba de unirse, no una columna que contenga todos los miembros de ese juego.

Cualquier ayuda se agradece, gracias.

Editar

He intentado la siguiente consulta:

SELECT t1.member_id, t2.*
FROM game_members t1
INNER JOIN game_main t2
ON t1.game_id = t2.id
WHERE t1.member_id = <some UID>

Que resultó en 1 fila y 2 columnas. Las columnas son "game_members.member_id" y "game_main.id". El valor de la primera columna es el UUID que especifiqué en la cláusula where y el valor de la segunda columna es el UUID del juego. Esperaba ver 2 filas de datos con el mismo "game_main.id" pero con diferentes "game_member.member_id", ya que actualmente tengo 2 entradas en el mismo juego.

Editar 2

Según lo solicitado, proporcionaré datos de muestra para mis tablas, así como la salida que deseo ver.

Datos de muestra:

[player_main]

id                                  
------------------------------------|
863fdf91-86fb-49a7-9232-bcb596e3a86f|
7af64cd7-72a2-410f-9b5c-620127fca0ac|
c7b1952a-b263-470f-9cae-9d5e6d7a8186|

[game_main]

id
------------------------------------|
dd76c680-5853-40a6-b757-0457d1a7e95f|
ca4f5b1f-0f8c-4f10-969c-464ccf207d9c|

[game_members]

member_id                           | game_id       
------------------------------------|------------------------------------
863fdf91-86fb-49a7-9232-bcb596e3a86f|dd76c680-5853-40a6-b757-0457d1a7e95f
7af64cd7-72a2-410f-9b5c-620127fca0ac|dd76c680-5853-40a6-b757-0457d1a7e95f
c7b1952a-b263-470f-9cae-9d5e6d7a8186|ca4f5b1f-0f8c-4f10-969c-464ccf207d9c

[salida deseada]

Así debería verse la información del juego actual del jugador. La consulta debe tomar solo el UUID del jugador y devolver lo siguiente si el UUID era igual a 863fdf91-86fb-49a7-9232-bcb596e3a86f

member_id                           | game_id       
------------------------------------|------------------------------------
863fdf91-86fb-49a7-9232-bcb596e3a86f|dd76c680-5853-40a6-b757-0457d1a7e95f
7af64cd7-72a2-410f-9b5c-620127fca0ac|dd76c680-5853-40a6-b757-0457d1a7e95f
1
Reminant 21 jul. 2016 a las 07:35

2 respuestas

La mejor respuesta

Intente hacer una autounión de la tabla game_members. La siguiente consulta generará todos los miembros únicos que tienen algún juego en común con los juegos utilizados por un determinado jugador.

SELECT DISTINCT t2.member_id, t1.game_id
FROM game_members t1
INNER JOIN game_members t2
    ON t1.game_id = t2.game_id
WHERE t1.member_id = <some UID>
0
Tim Biegeleisen 21 jul. 2016 a las 06:39

Puede dividir su problema en:

  • buscando el juego actual del jugador en game_members y luego,
  • buscar los jugadores actuales del juego en la misma tabla game_members

Este enfoque se traduce en la siguiente consulta que implica una autounión:

select
    gm2.member_id,
    gm1.game_id
from 
    game_members gm1
        inner join game_members gm2 on
            gm1.game_id = gm2.game_id   -- lookup the game's current players
where
    gm1.member_id = '863fdf91-86fb-49a7-9232-bcb596e3a86f'  -- lookup the player's current game
0
Chitharanjan Das 21 jul. 2016 a las 07:42