IZQUIERDA UNIRSE solo primera fila
He leído muchos hilos acerca de obtener solo la primera fila de un join izquierdo, 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 los feeds_artists, pero ya esto no funciona.
No puedo usar TOP
debido a mi base de datos y no puedo agrupar los resultados por feeds_artists.artist_id
ya que necesito ordenarlos por fecha (obtuve los resultados agrupándolos de esta manera, pero los resultados no fueron los más recientes)
Probé algo con OUTER APPLY también - tampoco tuvo éxito. Para ser honesto, realmente no puedo imaginar lo que está pasando en esas filas, probablemente la mayor razón 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'
4 answers
Si puede asumir que los ID de artista se incrementan con el tiempo, entonces el MIN(artist_id)
será el primero.
Así que intenta algo como esto (no probado...)
SELECT *
FROM feeds f
LEFT JOIN artists a ON a.artist_id = (
SELECT
MIN(fa.artist_id) a_id
FROM feeds_artists fa
WHERE fa.feed_id = f.feed_id
) a
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-25 23:16:03
Versión sin subselección:
SELECT f.title,
f.content,
MIN(a.artist_name) artist_name
FROM feeds f
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id
LEFT JOIN artists a ON fa.artist_id = a.artist_id
GROUP BY f.id
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-12 11:47:24
He usado algo más (creo que mejor...) y quiero compartirlo:
He creado una VISTA que tiene una cláusula "group"
CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code
SELECT * FROM client INNER JOIN vCountries on client_province = province_id
Quiero decir sin embargo, que creo que tenemos que 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!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 14:11:45
Quiero dar una respuesta más generalizada. Uno que manejará cualquier caso cuando desee seleccionar solo el primer elemento en una UNIÓN IZQUIERDA.
Puede utilizar una subconsulta que GROUP_CONCATS lo que desee (ordenados, también!), a continuación, simplemente dividir el resultado GROUP_CONCAT'd y tomar solo su primer elemento, así...
LEFT JOIN Person ON Person.id = (
SELECT SUBSTRING_INDEX(
GROUP_CONCAT(FirstName ORDER BY FirstName DESC SEPARATOR "_" ), '_', 1)
) FROM Person
);
Dado que tenemos DESC como nuestra opción ORDER BY, esto devolverá un id de persona para alguien como "Zack". Si quisiéramos a alguien con el nombre al igual que" Andy", cambiaríamos ORDER BY FirstName DESC a ORDER BY FirstName ASC.
Esto es ágil, ya que esto coloca el poder de ordenar totalmente dentro de sus manos. Pero, después de muchas pruebas, no escalará bien en una situación con muchos usuarios y muchos datos.
Es, sin embargo, útil en la ejecución de informes de uso intensivo de datos para el administrador.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 23:33:58