mysqli_num_rows - IZQUIERDA ÚNETE solo en la primera fila
mysqli_fetch_assoc (4)
He usado otra cosa (creo que es mejor ...) y quiero compartirla:
Creé una VISTA que tiene una cláusula de "grupo"
CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code
SELECT * FROM client INNER JOIN vCountries on client_province = province_id
Quiero decir todavía, que creo que tenemos que hacer esta solución PORQUE HICIMOS ALGO EQUIVOCADO 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!
Leí muchos temas sobre cómo obtener solo la primera fila de una combinación de la 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 los feeds_artists, pero esto ya 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 resultados al agruparlos de esta manera, pero los resultados no son los más recientes)
Intentó algo con APLICACIÓN EXTERIOR también, sin éxito también. Para ser sincero, no puedo imaginar qué está sucediendo en esas filas, probablemente la razón más grande 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''
Si puede suponer que las ID de los artistas se incrementan con el tiempo, entonces MIN(artist_id)
será el más antiguo.
Intente 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
Versión sin subselección que se unirá solo al primer autor:
SELECT f.title,
f.content,
a.artist_name artist_name,
min(a.id) as m
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
HAVING a.id = m;
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