Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

309
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!