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'
Author: KddC, 2013-03-26

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
 79
Author: Matt Dodge,
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
 47
Author: Denis Khvorostin,
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!

 1
Author: AriWais,
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.

 0
Author: HoldOffHunger,
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