Seleccione todas las filas donde todos los valores de la matriz están presentes en otra columna

Jed

Digamos que tengo dos tablas:

--------------------------------
| user_id  | permissions        |
---------------------------------
|    1     | ['perm1', 'perm2'] | 
---------------------------------
|    2     | ['perm1']          |
---------------------------------

----------------------------------------
| integration_id | permissions_required |
-----------------------------------------
|       1        |   ['perm1']          |
-----------------------------------------
|       2        |   ['perm2']          |
-----------------------------------------
|       3        |   ['perm1', 'perm2'] |
------------------------------------------

Me gustaría poder consultar todas las integraciones a las que un usuario específico tiene acceso. He estado buscando por un tiempo, pero soy bastante nuevo en el uso de mysql hasta este punto.

¿Cómo haría para consultar estas tablas para encontrar todas las integraciones en las que el usuario tiene todos los permisos necesarios?

EDITAR: Me doy cuenta de que no mencioné que los permisos y las columnas permissions_required son columnas JSON. Según la respuesta aceptada, voy a mencionar el tema de la reestructuración de los permisos de nuestra base de datos para usar muchos-> muchos tradicionales en lugar de matrices.

Stefano Zanini

Este es un claro ejemplo de por qué almacenar valores separados por comas en una sola columna es una mala idea. Con el diseño que tiene, deberá dividir cadenas (MySQL ni siquiera tiene una función incorporada para eso) y luego unir tablas según el resultado de las divisiones.

La tarea que desea hacer sería increíblemente más fácil en un esquema de tablas diseñado correctamente.

Comenzando desde cero, sus entidades son user, integrationy permissionpor lo tanto necesita una tabla para cada una de ellas.

User: id, name, whatever_else
Integration: id, description, whatever_else
Permission: id, description, whatever_else

La relación entre usery permissiones many-to-many, porque cada uno userpuede tener múltiples permissionsy cada uno permissionpuede asignarse a múltiples users: desea modelar esto con otra tabla y luego

UserPermission: userID, permissionID

Lo mismo vale para la relación entre permissiony integration: cada uno integrationpuede requerir varios permissions, cada uno permissionpuede ser necesario para varios integrations.

IntegrationPermission: integrationID, permissionID

Sus datos de muestra se verían así

User
id | name
1  | User1
2  | User2

Permission
id | desc
1  | Perm1
2  | Perm2

UserPermission
userID | permissionID
1      | 1
1      | 2
2      | 1

Integration
id | desc
1  | Integration1
2  | Integration2
3  | Integration3

IntegrationPermission
integrationID | permissionID
1             | 1
2             | 2
3             | 1
3             | 2

Ahora la consulta: la parte complicada es tomar a los usuarios que tienen todos los permisos necesarios para una integración. Construyamos esto en unos pocos pasos.

En primer lugar, combinamos las dos tablas de relaciones para obtener el usuario, la integración y el número de permisos que tiene un usuario para esa integración.

select  t1.userID,
        t2.integrationID,
        count(distinct t2.permissionID) as userIntegrationPermissions
from    userPermission t1
join    integrationPermission t2
on      t1.permissionID = t2.permissionID
group by t1.userID, t2.integrationID

Luego, necesitamos el recuento de los permisos necesarios para cada integración.

select  integrationID,
        count(permissionID) permCount
from    integrationPermission
group by integrationID

Finalmente unimos estos dos, agregando tablas de Usuario e Integración para obtener las descripciones (esto es opcional por supuesto)

select  tt3.id, tt3.name, tt4.id, tt4.desc
from    (
            select  t1.userID,
                    t2.integrationID,
                    count(distinct t2.permissionID) as userIntegrationPermissions
            from    UserPermission t1
            join    IntegrationPermission t2
            on      t1.permissionID = t2.permissionID
            group by t1.userID, t2.integrationID
        ) tt1
join    (
            select  integrationID,
                    count(permissionID) permCount
            from    IntegrationPermission
            group by integrationID
        ) tt2
on      tt1.integrationID = tt2.integrationID and
        tt1.userIntegrationPermissions = tt2.permCount
join    User tt3
on      tt1.userID = tt3.id
join    Integration tt4
on      tt1.integrationID = tt4.id
order by 1, 3

Puedes jugar con él en este enlace (rextester)

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Seleccione TODAS las filas donde los valores de la columna Pandas DataFrame en una lista

Seleccione todas las filas donde la matriz contiene valores de una lista dada en Postgres

Seleccione todas las filas de una tabla, excepto donde la fila en otra tabla con la misma identificación tenga un valor particular en otra columna

SQL Server: seleccione todas las filas donde la columna no contiene ningún valor de la tabla dinámica de valores

Encontrar celdas en las que están presentes todos los valores de la matriz fija

Encontrar celdas en las que están presentes todos los valores de la matriz fija

Seleccione Id donde la columna toma todos los valores en

Sumar todos los valores en todas las filas usando la fórmula de matriz

¿Reemplazar (gsub) todas las filas en una columna de los valores en otra columna?

Seleccione todas las filas donde clave en la matriz de valor clave JSON

MYSQL: seleccione el recuento de todas las filas que están duplicadas en 1 columna y distintas en otra columna

Compruebe si todas las filas de una matriz están presentes en otra matriz más grande

PostgreSQL Obtiene todas las filas donde su ID no está en ninguna otra columna de una tabla

buscar filas en la tabla donde todos los valores de las columnas estén dentro de un rango específico

seleccione los valores de las columnas en función de otros dos valores de otra columna

Spark obtiene todas las filas con los mismos valores en la matriz en la columna

¿Cómo obtengo el mínimo / máximo de columnas en la tabla A y los valores de B donde las filas de B están determinadas por otra columna en A?

Seleccione filas con la misma identificación pero todos los valores nulos en alguna otra columna y agrupe por la misma identificación

Arraylist obtiene los mismos valores para todas las filas en todas las posiciones de la matriz

Seleccione la columna donde aparece el valor en una matriz determinada y donde existe el valor de la columna para todas las entradas de la matriz

Archivo por lotes para extraer todas las filas donde los valores de la columna cumplen con los criterios

Cómo seleccionar filas donde los valores son mayores en función de los valores de otra columna en SQL

¿Cómo consultar todas las filas en las que una columna determinada coincide con al menos todos los valores de una matriz determinada con PostgreSQL?

Encuentre todas las combinaciones que incluyen un valor específico donde todos los valores están uno al lado del otro en la matriz

Seleccione filas de una tabla y ajuste los valores en función de las filas de otra tabla.

Sumar los valores de las filas según el inicio y la fecha de un mes en otra columna

Usar dplyr para verificar los valores de varias filas que cumplen una condición (excepto todas las filas donde la columna de fecha cae en un período específico)

Rieles: busque todos los registros donde la columna de cadena contiene todas las palabras de una matriz de cadenas

Cómo insertar todos los símbolos únicos utilizados en todas las filas de una columna a otra

TOP Lista

  1. 1

    ¿Cómo ocultar la aplicación web de los robots de búsqueda? (ASP.NET)

  2. 2

    Kibana 4 , making pie chart , error message

  3. 3

    Manera correcta de agregar referencias al proyecto C # de modo que sean compatibles con el control de versiones

  4. 4

    récupérer les noms de clés depuis Firebase react-native

  5. 5

    OAuth 2.0 utilizando Spring Security + WSO2 Identity Server

  6. 6

    Cómo eliminar o caducar las cookies en Chrome usando asp.net

  7. 7

    desbordamiento: oculto no funciona al hacer zoom en un iframe de YouTube usando transformar

  8. 8

    Cómo extraer una palabra clave (cadena) de una columna en pandas dataframe en python

  9. 9

    Link library in Visual Studio, why two different ways?

  10. 10

    선언되지 않은 유형 'MessagingDelegate'사용

  11. 11

    actualizar el contenido de la vista de reciclaje falla en la hoja inferior

  12. 12

    Ver todos los comentarios en un video de YouTube

  13. 13

    Problema con la vista de impresión de PDF

  14. 14

    ¿Cómo pintar el Dropline de un RowHeader-JTable en el Main-JTable durante un DragAndDrop?

  15. 15

    Pregunta de fórmula de desplazamiento y transposición de Excel / Google Sheets

  16. 16

    ¿Cómo puedo hacer accesible la información de color en tablas HTML?

  17. 17

    ¿Cómo generalizar el JSON en el procedimiento almacenado?

  18. 18

    Recortar fotos rectangulares de escaneos en OpenCV con Python

  19. 19

    2D 배열에 대한 Numpy 요소 별 평균 계산

  20. 20

    Typescript의 "window"전역 개체에 "adsbygoogle"애드 센스 속성을 추가하는 방법은 무엇입니까?

  21. 21

    Error: la ejecución falló para la tarea ': app: compileDebugJavaWithJavac'. java.io.FileNotFoundException:

CalienteEtiquetas

Archivo