mysql - Cómo limitar los resultados de una IZQUIERDA
subquery left-join (4)
Aquí es donde las funciones de clasificación serían muy útiles. Desafortunadamente, MySQL todavía no los soporta. En su lugar, puede intentar algo como lo siguiente.
Select ta.product_id, ta.product_name
, tb.transaction_date
From tbl_product As ta
Left Join (
Select tx1.product_id, tx1.transaction_id, tx1.transaction_date
, (Select Count(*)
From tbl_transaction As tx2
Where tx2.product_id = tx1.product_id
And tx2.transaction_id < tx1.transaction_id) As [Rank]
From tbl_transaction As tx1
) as tb
On tb.product_id = ta.product_id
And tb.[rank] <= 4
Limit 10
Tomemos el caso de dos tablas: tbl_product
y tbl_transaction
.
tbl_product
enumera los detalles del producto, incluidos los nombres y los identificadores, mientras que tbl_transaction
enumera las transacciones relacionadas con los productos e incluye fechas, identificadores de producto, clientes, etc.
Necesito mostrar una página web que muestre 10 productos y para cada producto, las últimas 5 transacciones. Hasta ahora, ninguna consulta LEFT JOIN
parece funcionar y la subconsulta a continuación hubiera funcionado si mysql pudiera permitir la parte tx.product_id=ta.product_id
(falla con la columna Desconocida ''ta.product_id'' en ''where cláusula'': [ERROR: 1054 ] ).
SELECT
ta.product_id,
ta.product_name,
tb.transaction_date
FROM tbl_product ta
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx WHERE tx.product_id=ta.product_id LIMIT 5) tb
LIMIT 10
¿Hay alguna forma de lograr el listado que necesito sin usar varias consultas en un bucle ?
Editar:
Esto es exactamente lo que necesito de MySQL:
SELECT ta.product_id, ta.product_name, tb.transaction_date ...
FROM tbl_product ta
LEFT JOIN tbl_transaction tb ON (tb.product_id=ta.product_id LIMIT 5)
LIMIT 10
Por supuesto, esto es ilegal, ¡pero realmente deseo que no lo fuera!
Editar:
Si desea imponer un límite en cada producto, lo separaría en dos consultas.
Primero obtenga una lista de 10 productos y luego ejecute otra consulta para cada uno de los que devuelven las últimas cinco transacciones.
Encontré la forma de LEFT JOIN con subconsulta, ordenada y limitada, funciona en RDS Amazon, MariaDB v10.2
LEFT JOIN activities last_activity ON last_activity.id = (
SELECT id FROM activities
WHERE contester_id = contesters.id AND `type` IN ({$last_activity_types})
ORDER BY id DESC LIMIT 1
)
Todas las otras formas de hacer LEFT JOIN con GROUPING y SORTING no funcionaron para mí. Este ejemplo es excepción de trabajo.
Falla porque cuando colocas paréntesis alrededor de tu consulta y le das el alias "tb" has creado una tabla derivada. Su tabla derivada no tiene conocimiento de la tabla tbl_product que tiene el alias "ta"
Intente usar ON o WHERE fuera de la tabla derivada, luego haga referencia a esa tabla usando el alias "tb" que proporcionó
EDITAR:
El uso de "LIMIT" limita los resultados de la consulta en su totalidad. Si bien tiene "LÍMITE 10", lo que realmente desea es 50 filas (o menos si hay menos de 5 históricos), ¿es así?
10 productos, unidos a 5 registros históricos, devolviendo 50 filas totales.
En este caso, puede hacer que una única solución de consulta se una a la tabla del producto en una tabla derivada que tenga "LÍMITE 10"
Como:
SELECT *
FROM tbl_product ta
JOIN (SELECT * FROM tbl_product tz WHERE tz.product_id = ta.product_id LIMIT 10) tc
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx
WHERE tx.product_id=ta.product_id LIMIT 5) tb
También puede usar "in" y especificar los 10 principales, como:
SELECT *
FROM tbl_product ta
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx
WHERE tx.product_id=ta.product_id LIMIT 5) tb
WHERE ta.product_id IN
(SELECT z.product_id FROM tbl_product z LIMIT 10)