sql >> Base de Datos >  >> RDS >> Mysql

MySQL:¿Puedo hacer una combinación izquierda y extraer solo una fila de la tabla de combinación?

Déjame resumir lo que entendí:te gustaría seleccionar cada boleto y su última solución.

Me gusta usar el siguiente patrón para este tipo de pregunta, ya que evita el patrón de subconsulta y, por lo tanto, es bastante bueno cuando se necesita rendimiento. El inconveniente es que es un poco complicado de entender:

SELECT
  t.*,
  s1.*
FROM tickets t
INNER JOIN solutions s1 ON t.id = s1.ticket_id
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id AND s2.id > s1.id
WHERE s2.id IS NULL;

Escribí solo el corazón del patrón para una mejor comprensión.

Las claves son:

  • la UNIÓN IZQUIERDA de las solutions tabla consigo misma con el s1.ticket_id = s2.ticket_id condición:emula el GROUP BY ticket_id .

  • la condición s2.id > s1.id :es el SQL para "Solo quiero la última solución", emula el MAX() . Asumí que en tu modelo, the last significa with the greatest id pero podría usar aquí una condición en la fecha. Tenga en cuenta que s2.id < s1.id te daría la primera solución.

  • la cláusula WHERE s2.id IS NULL :el más extraño pero absolutamente necesario... mantiene solo los registros que desea.

Pruébalo y avísame :)

Edición 1: Me acabo de dar cuenta de que la suposición del segundo punto estaba simplificando demasiado el problema. Eso lo hace aún más interesante :p Estoy tratando de ver cómo este patrón puede funcionar con tu date, id ordenar.

Edición 2: Ok, funciona muy bien con un pequeño giro. La condición en LEFT JOIN se convierte en:

LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id
  AND (s2.date > s1.date OR (s2.date = s1.date AND s2.id > s1.id))