SQL: busque todos los "ID de relación" donde la clave sea igual al valor, luego seleccione todos los registros que contengan esos "ID de relación"

2022-10-06 23:24:31

Tengo una enorme y dolorosa tabla heredada de unos pocos millones de registros que tengo problemas para consultar de manera eficiente. La tabla se parece un poco a esto:

id | submissionId | key     | value
------------------------------------
1  | 1            | userID  | 1
2  | 1            | data    | stuff
3  | 2            | userID  | 2
4  | 2            | data    | stuff2
5  | 2            | data2   | stuff3
6  | 3            | userID  | 1
7  | 3            | data    | stuff2
8  | 3            | data2   | stuff3

Lo que intento consultar es seleccionar todos los "datos de envío" para un usuario en particular. Entonces, el resultado para userID === 1 solo seleccionaría "datos de envío" relacionados con el ID de usuario, es decir:

1  | 1            | userID  | 1
2  | 1            | data    | stuff
6  | 3            | userID  | 1
7  | 3            | data    | stuff2
8  | 3            | data2   | stuff3

Por el momento, mi mejor solución es seleccionar todos los registros para un ID de usuario específico. Luego, recorre los resultados y coloca los ID de envío en una matriz. Luego seleccionando todos los registros donde el ID de envío coincide con un ID de envío en mi matriz.

Esto consume mucho tiempo, ya que hay alrededor de 15 000 usuarios que también deben ser conectados. ¡Cualquier idea para hacer esto más eficiente o en una sola consulta sería muy apreciada!

- pessato

Source
Responder


2
  • Simplemente puede consultar cualquier registro que tenga un submissionId relacionado con un value particular:

    SELECT *
    FROM submissions
    WHERE submissionId IN (SELECT submissionId
                           FROM submissions
                           WHERE value = 1 AND key = 'userID')