Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

307
Visualizações
Una consulta para una combinación que usa el primer resultado en el segundo (subconsulta) para obtener todas las filas

así que he estado luchando con este por un tiempo. Si bien podría hacer dos consultas separadas para este problema, me pregunto si sería posible hacer una consulta. Creo que un profesional de SQL sin duda sabrá cómo hacer esto. Entonces, ésta es la cuestión:

Tenemos dos tablas de publicaciones y post_translations. Abreviado por simplicidad.

 posts ------ id post_translations ----------------- id post_id (which is the FK on posts...) locale slug content ... (and so on)

Para mí está claro que ahora podría hacer un INNER JOIN muy simple para traducir todas las publicaciones a un idioma específico, digamos 'en' o 'de' si lo desea. Así que no te voy a molestar más con esto.

Pero como la tabla también tendrá sublocales, como en (para EE. UU.), en-GB, en-AU, de (para Alemania), de-AT, de-CH... todo se vuelve un poco más complejo para el siguiente szenario.

Digamos que hay publicaciones traducidas solo en los idiomas 'de' y también en 'de-AT'. Entonces la tabla quedaría así:

 post_translations id post_id locale content 1 1 de ... 2 1 de-AT ... 3 2 de ...

Entonces, la publicación 1 está disponible en 'de' y 'de-AT'. La publicación 2 solo está disponible en 'de-AT'.

Si quiero tener todas las publicaciones en 'de', es fácil. Solo agrego un WHERE locale = 'de' y estoy bien. Pero digamos que quiero todas las publicaciones en 'de-AT' y todas las demás publicaciones en 'de' que no están traducidas en 'de-AT' para no obtener duplicados. ¿Cómo puedo lograr eso en una consulta? Como se mencionó anteriormente, podría ejecutar dos consultas aquí, primero obtengo todas las publicaciones en 'de-AT', luego obtengo todas las publicaciones en 'de' y uso los 'post_id's que obtuve de la primera consulta con un WHERE not IN consulta, por lo que no obtengo ningún duplicado.

Estas consultas serían entonces:

 SELECT pt.post_id FROM posts AS p INNER JOIN post_translations AS pt ON p.id = pt.post_id WHERE pt.locale = 'de-AT';

y de esta consulta usaría el post_id en este:

 SELECT * FROM posts AS p INNER JOIN post_translations AS pt ON p.id = pt.post_id WHERE pt.locale = 'de' AND pt.post_id NOT IN (*post_ids found in first search*);

Entonces, si nos mantenemos con la tabla post_translations mencionada anteriormente, el resultado deseado sería:

 p.id pt.id pt.post_id pt.locale pt.content 1 2 1 de-AT ... 2 3 2 de ...

p significa publicaciones y pt para post_translations obviamente.

La idea detrás de la consulta es mostrar las publicaciones específicas de una región, en este caso 'de-AT', pero también mostrar las publicaciones genéricas que se escribieron para los usuarios 'de'.

Espero que tenga sentido. Agradecería cualquier ayuda en esto. Gracias.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Una opción utiliza not exists :

 select pt.* from post_translations pt where locale = 'de-AT' or ( locale = 'de' and not exists ( select 1 from post_translations pt1 where pt1.post_id = pt.post_id and pt1.locale = 'de-AT' ) )

Alternativamente, si está ejecutando MySQL 8.0, también puede usar row_number() :

 select * from ( select pt.*, row_number() over(partition by post_id order by (locale = 'de')) rn from post_translations pt where locale in ('de', 'de-AT') ) pt where rn = 1

Puede modificar fácilmente las consultas anteriores para join a la tabla de posts .

over 4 years ago · Santiago Trujillo Relatório

0

mostrar las publicaciones específicas para una región, en este caso 'de-AT' pero también para mostrar las publicaciones genéricas que se escribieron para los usuarios 'de'

Creo que una simple cláusula WHERE con el operador IN devolvería los resultados esperados.
Luego, puede usar la agregación condicional para marcar las publicaciones que tienen la configuración regional secundaria que desea y tal vez ordenar estas publicaciones primero:

 SELECT post_id, MAX(locale = 'de-AT') AS flag FROM post_translations WHERE locale IN ('de', 'de-AT') GROUP BY post_id ORDER BY flag DESC

Puede unir la consulta anterior a las posts para obtener los detalles de cada publicación:

 SELECT p.*, t.flag FROM posts AS p INNER JOIN ( SELECT post_id, MAX(locale = 'de-AT') AS flag FROM post_translations WHERE locale IN ('de', 'de-AT') GROUP BY post_id ) t ON t.post_id = p.id ORDER BY t.flag DESC
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda