Estoy buscando unas cuantas mesas para las publicaciones de trabajo que quiero filtrar. Una de las tablas es la tabla "Master", que es uno a uno, tiene información que incluye la ID de trabajo, la ubicación y el salario. La otra tabla es una tabla de "etiquetas" que es una tabla de uno a muchos que tiene varias "etiquetas" (como educación, experiencia, habilidades blandas y habilidades difíciles) asociadas con ella. Tenga en cuenta que hay millones de identificaciones de trabajo y, por lo tanto, incluso más etiquetas.

Mesa "maestro"

╔══════╦═══════════╦════════╦
║ id   ║  location ║salary  ║
╠══════╬═══════════╬════════╬
║  zy3 ║ CA        ║100,000 ║
║  w1e ║ TX        ║150,000 ║
║  sr2 ║ UT        ║200,000 ║
║  hi9 ║ NY        ║130,000 ║
╚══════╩═══════════╩════════╩ 

Tabla "Etiquetas"

╔══════╦════════╦
║ id   ║  tag   ║ 
╠══════╬════════╬
║  zy3 ║ Python ║
║  zy3 ║ Hadoop ║
║  zy3 ║ master ║
║  w1e ║ Hadoop ║ 
║  w1e ║ BS     ║
║  w1e ║ junior ║ 
║  sr2 ║ Hadoop ║ 
║  sr2 ║ Tech   ║
║  sr2 ║ Stats  ║ 
║  hi9 ║ Java   ║ 
║  hi9 ║ Spark  ║ 
║  hi9 ║ GCP    ║
║  hi9 ║ MS     ║ 
╚══════╩════════╩

Estoy deseando substar la tabla "Master" para incluir solo los roles que, por ejemplo, incluyen dos o más de las siguientes etiquetas:

Python, Hadoop, Java, Chispa

Entonces, entonces la nueva tabla maestra se vería:

╔══════╦═══════════╦════════╦
║ id   ║  location ║salary  ║
╠══════╬═══════════╬════════╬
║  zy3 ║ CA        ║100,000 ║
║  hi9 ║ NY        ║130,000 ║
╚══════╩═══════════╩════════╩ 

Estoy considerando la introducción de otra tabla que tendría una lista de etiquetas diferentes que aceptaría.

Hasta cierto punto, he podido codificar una solución dura, pero realmente es exigente computacionalmente, especialmente porque estoy trabajando con millones de filas y, a veces, hay muchas etiquetas potenciales con las que coincidiría (en este caso, fue solo Cuatro etiquetas de interés). A continuación se muestra el código que he usado.

select * from master t0 
where (select count(id) from 
((select id from master t1 where t1.id=t0.id and exists (select 1 from tags t2 where t1.id=t2.id and t2.tag='Python'))
union
(select id from master t1 where t1.id=t0.id and exists (select 1 from tags t2 where t1.id=t2.id and t2.tag='Hadoop'))
union
(select id from master t1 where t1.id=t0.id and exists (select 1 from tags t2 where t1.id=t2.id and t2.tag='Java'))
union
(select id from master t1 where t1.id=t0.id and exists (select 1 from tags t2 where t1.id=t2.id and t2.tag='Spark'))) tx) 
>=2;
0
Mitchell Pudil 1 jul. 2019 a las 23:24

1 respuesta

La mejor respuesta

No necesita un UNION, solo use WHERE tag in (<list of specified tags>). Luego únete a la tabla master.

SELECT m.*
FROM master AS m
JOIN (
    SELECT id
    FROM tags
    WHERE tag in ('python', 'hadoop', 'java', 'spark')
    GROUP BY id
    HAVING COUNT(*) >= 2
) AS t ON m.id = t.id
0
Barmar 1 jul. 2019 a las 20:31