Sé que esta pregunta se ha hecho muchas veces, pero estoy teniendo problemas para implementarla.
He hecho un ejemplo de reducción por lo que es fácil de reproducir.
Quiero unirme a 3 mesas pero en el último que quieren limitar a 2 filas DESC
UNIR 3 tablas y (LIMITAR 2 filas ORDEN POR tiempo DESC)
CREATE TABLE `cars` (
`car_id` int(11) NOT NULL AUTO_INCREMENT,
`plate` varchar(10) NOT NULL,
`km` int(11) NOT NULL,
`status` tinyint(1) NOT NULL,
PRIMARY KEY (`car_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
INSERT INTO `cars` (`car_id`, `plate`, `km`, `status`) VALUES
(1, 'ABC1234', 130123, 1),
(2, 'DEF1234', 100123, 1),
(3, 'QWE1234', 5000, 1),
(4, 'ASD1234', 3000, 1),
(5, 'ZXC1234', 23000, 0);
CREATE TABLE `cars_to_users` (
`car_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
UNIQUE KEY `car_id` (`car_id`,`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `cars_to_users` (`car_id`, `user_id`) VALUES
(1, 1),
(2, 1),
(3, 2),
(4, 2),
(5, 2);
CREATE TABLE `service` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`car_plate` varchar(10) NOT NULL,
`s_timestamp` int(10) NOT NULL,
`price` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=111 ;
INSERT INTO `service` (`id`, `car_plate`, `s_timestamp`, `price`) VALUES
(1, 'ABC1234', 1312300100, 30),
(2, 'DEF1234', 1312300100, 15),
(3, 'QWE1234', 1312300100, 16),
(4, 'ASD1234', 1312300100, 50),
(5, 'ABC1234', 1312300200, 50),
(6, 'DEF1234', 1312300200, 25),
(7, 'QWE1234', 1312300200, 30),
(8, 'ABC1234', 1312300300, 20),
(9, 'ASD1234', 1312300300, 60),
(10, 'ABC1234', 1312300400, 15),
(11, 'ASD1234', 1312300400, 20);
Lo que quiero es este
car_id plate km car_plate s_timestamp price
3 QWE1234 5000 QWE1234 1312300200 30
3 QWE1234 5000 QWE1234 1312300100 16
4 ASD1234 3000 ASD1234 1312300400 20
4 ASD1234 3000 ASD1234 1312300300 60
2 filas de "s ervicio "mesa para todos los coches de la user_id = 2 ordenado por DESC s_timestamp
ORDER BY s_timestamp LIMIT 2 DESC
de que este intento consulta pero me da todas las filas de "servicio"
SELECT ctu.user_id, c.car_id, c.plate, c.km, s.car_plate, s.s_timestamp, s.price
FROM cars_to_users ctu
LEFT JOIN cars c ON ctu.car_id = c.car_id
LEFT JOIN service s ON c.plate = s.car_plate
WHERE ctu.user_id = '2'
AND c.status = 1
Si agrego" GROUP BY c .car_id "Solo obtengo 1 fila por auto y no 2 Quiero
Intento muchas consultas pero no consigo lo que quiero.
Una cosa a tener en cuenta es que el "servicio" de la tabla tiene más de 9 millones de filas y más datos que el ejemplo, y crece.
¿Cuál es la versión de mysql que está utilizando como dijo el límite no funciona en su versión ??? – reggie
¿Pudiste usar mis declaraciones, usar tablas temporales debería hacerlo un poco más rápido? – ace
@ace Su solución también funciona muy bien. Pero si se puede lograr lo mismo a través de una consulta secundaria y el número de filas que se recuperarán en la tabla de subconsulta/temperatura es solo 2, ¿por qué no utilizar la subconsulta en su lugar? – reggie