Leí muchos hilos sobre obtener solo la primera fila de una unión izquierda, pero, por alguna razón, esto no funciona para mí.
Aquí está mi estructura (simplificada, por supuesto)
Feeds
id | title | content
----------------------
1 | Feed 1 | ...
Artistas
artist_id | artist_name
-----------------------
1 | Artist 1
2 | Artist 2
feeds_artists
rel_id | artist_id | feed_id
----------------------------
1 | 1 | 1
2 | 2 | 1
...
Ahora quiero obtener los artículos y unirme solo al primer Artista y pensé en algo como esto:
SELECT *
FROM feeds
LEFT JOIN feeds_artists ON wp_feeds.id = (
SELECT feeds_artists.feed_id FROM feeds_artists
WHERE feeds_artists.feed_id = feeds.id
LIMIT 1
)
WHERE feeds.id = '13815'
solo para obtener solo la primera fila de feeds_artists, pero esto ya no funciona.
No puedo usarlo TOP
debido a mi base de datos y no puedo agrupar los resultados feeds_artists.artist_id
porque necesito ordenarlos por fecha (obtuve los resultados al agruparlos de esta manera, pero los resultados no fueron los más nuevos)
Intenté algo con OUTER APPLY también, sin éxito también. Para ser honesto, realmente no puedo imaginar lo que está sucediendo en esas filas, probablemente la razón más importante por la que no puedo hacer que esto funcione.
SOLUCIÓN:
SELECT *
FROM feeds f
LEFT JOIN artists a ON a.artist_id = (
SELECT artist_id
FROM feeds_artists fa
WHERE fa.feed_id = f.id
LIMIT 1
)
WHERE f.id = '13815'
Respuestas:
Si puede suponer que las ID de los artistas aumentan con el tiempo, entonces
MIN(artist_id)
será la más temprana.Así que intente algo como esto (no probado ...)
fuente
Versión sin subselección:
fuente
La respuesta de @Matt Dodges me puso en el camino correcto. Gracias de nuevo por todas las respuestas, que ayudaron a muchos chicos mientras tanto. Lo tengo funcionando así:
fuente
f.id
condición.He usado algo más (creo que mejor ...) y quiero compartirlo:
Creé una vista que tiene una cláusula de "grupo"
Quiero decir todavía, que creo que necesitamos hacer esta solución PORQUE HICIMOS ALGO MAL EN EL ANÁLISIS ... al menos en mi caso ... pero a veces es más barato hacer esto que rediseñar todo ...
¡Espero que ayude!
fuente
country_code
, esoGROUP BY
es incorrecto. VerONLY_FULL_GROUP_BY
.WITH x AS (
cláusula?basado en varias respuestas aquí, encontré algo que funcionó para mí y quería generalizar y explicar lo que está sucediendo.
convertir:
a:
la condición que conecta t1 y t2 se mueve desde
ON
y hacia la consulta internaWHERE
. laMIN(primary key)
oLIMIT 1
se asegura de que sólo el 1 fila es devuelta por la consulta interna.después de seleccionar una fila específica, necesitamos decir
ON
qué fila es. Es por eso queON
está comparando la clave principal de la tabla unida.puede jugar con la consulta interna (es decir, orden + límite), pero debe devolver una clave principal de la fila deseada que le dirá a la
ON
fila exacta a unirse.fuente
LIMIT
o soloMIN
. laON
condición debe estar en la clave primaria de la tabla unida para evitar el impacto en el rendimiento.Quiero dar una respuesta más generalizada . Uno que manejará cualquier caso cuando desee seleccionar solo el primer elemento de una IZQUIERDA .
Puede usar una subconsulta que GROUP_CONCATS lo desee (¡también ordenada!), Luego simplemente divida el resultado de GROUP_CONCAT'd y tome solo su primer elemento, así ...
Como tenemos DESC como nuestra opción ORDER BY , esto devolverá una identificación de persona para alguien como "Zack". Si quisiéramos a alguien con el nombre "Andy", cambiaríamos ORDER BY FirstName DESC a ORDER BY FirstName ASC .
Esto es ágil, ya que esto pone el poder de ordenar totalmente en tus manos. Pero, después de muchas pruebas, no escalará bien en una situación con muchos usuarios y muchos datos.
Sin embargo, es útil para ejecutar informes intensivos en datos para el administrador.
fuente
GROUP_CONCAT
truco es bueno siempre que el número de valores sea limitado. El límite predeterminado es 1024 caracteres.