Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta en MySQL

Estas en el tema de Consulta en MySQL en el foro de Mysql en Foros del Web. Hola Foro: Tengo un dilema que deseo resolver a nivel de BD. Tengo un reporte en PHP que me funciona muy bien, pero cuando se ...
  #1 (permalink)  
Antiguo 20/02/2017, 15:42
 
Fecha de Ingreso: diciembre-2010
Ubicación: Asunción
Mensajes: 41
Antigüedad: 8 años, 11 meses
Puntos: 1
Consulta en MySQL

Hola Foro:

Tengo un dilema que deseo resolver a nivel de BD. Tengo un reporte en PHP que me funciona muy bien, pero cuando se carga demora un mundo para sacar la información. Considero que es por causa de que la consulta es amplia.

Bueno al grano quiero crear una consulta que traiga todos los datos de una y luego yo los ordeno.

Mi tabla es:
Código:
CREATE TABLE `salidas` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`no_sal_vuelta` INT(11) NOT NULL DEFAULT '0',
	`no_bus` INT(11) NOT NULL,
	`id_conductor` INT(11) NOT NULL,
	`id_ramal` INT(11) NOT NULL,
	`bol_ini_entero` INT(11) NOT NULL DEFAULT '0',
	`bol_fin_entero` INT(11) NOT NULL DEFAULT '0',
	`bol_ini_medio` INT(11) NOT NULL DEFAULT '0',
	`bol_fin_medio` INT(11) NOT NULL DEFAULT '0',
	`no_redondo` INT(11) NOT NULL,
	`modo` INT(11) NOT NULL,
	`id_horario` INT(11) NOT NULL,
	`fecha_salida` DATE NOT NULL,
	`hora_salida` TIME NOT NULL,
	`real_salida` TIME NOT NULL,
	`etapa1` TIME NOT NULL,
	`real1` TIME NOT NULL,
	`etapa2` TIME NOT NULL,
	`real2` TIME NOT NULL,
	`etapa3` TIME NOT NULL,
	`real3` TIME NOT NULL,
	`etapa4` TIME NOT NULL,
	`real4` TIME NOT NULL,
	`etapa5` TIME NOT NULL,
	`real5` TIME NOT NULL,
	`etapa6` TIME NOT NULL,
	`real6` TIME NOT NULL,
	`hora_llegada` TIME NOT NULL,
	`real_llegada` TIME NOT NULL,
	`km_inicial` DECIMAL(10,2) NOT NULL,
	`km_final` DECIMAL(10,2) NOT NULL,
	`rendido` INT(1) NOT NULL DEFAULT '0' COMMENT '0-No; 1-Si',
	`id_rendicion` INT(11) NOT NULL DEFAULT '0',
	`observacion` VARCHAR(350) NOT NULL COLLATE 'utf8_spanish2_ci',
	`user_add` VARCHAR(15) NOT NULL COLLATE 'utf8_spanish2_ci',
	`fecha_add` DATETIME NOT NULL,
	`user_edit` VARCHAR(15) NOT NULL COLLATE 'utf8_spanish2_ci',
	`fecha_edit` DATETIME NOT NULL,
	`del` INT(1) NOT NULL COMMENT '0-No; 1-Si',
	`user_del` VARCHAR(15) NOT NULL COLLATE 'utf8_spanish2_ci',
	`fecha_del` DATETIME NOT NULL,
	PRIMARY KEY (`id`)
)
COMMENT='Registro de Cada Salida de Buses de las Paradas'
COLLATE='utf8_spanish2_ci'
ENGINE=MyISAM
AUTO_INCREMENT=83338
;
Es una tabla de salidas de una empresa de transporte. Entonces por lo general los viajes tienen una IDA y una VUELTA que yo identifico en el campo modo (valores 1 o 2) y la vinculación está en el campo id --> no_sal_vuelta.

Bueno yo necesito mostrar en un sola línea los siguientes datos:
id, fecha_salida, no_bus, no_redondo, id_ramal (cuando es modo 1), hora_salida (modo 1), id_ramal (cuando es modo 2), hora_salida (modo 2)

Se me había ocurrido un SELECT así:
SELECT
sal.id,
sal.fecha_salida,
sal.no_bus,
sal.no_redondo,
ram.nombre AS ramal_ida,
sal.hora_salida,
...
...
...
FROM salidas sal
LEFT JOIN ramales ram
ON sal.id_ramal = ram.id
WHERE sal.del = 0
AND sal.fecha_salida = '2017-02-18'
AND sal.modo = 1
ORDER BY hora_salida ASC

Pero en donde están los "..." no se como vincular los datos de ese otro registro que me debe dar la información. No se si con un UNION o con un SELECT dentro de este SELECT... la verdad es que no se como enfrentar este problema. Y lo más sencillo que es que los datos están en la misma tabla.

Alguna sugerencia.
  #2 (permalink)  
Antiguo 20/02/2017, 18:16
 
Fecha de Ingreso: diciembre-2010
Ubicación: Asunción
Mensajes: 41
Antigüedad: 8 años, 11 meses
Puntos: 1
Respuesta: Consulta en MySQL

Un ejemplo de los datos sería:

"id" "no_sal_vuelta" "fecha_salida" "no_bus" "no_redondo" "id_ramal" "ramal" "modo" "hora_salida"
"83223" "0" "2017-02-20" "59" "1" "100" "MEDIO REDONDO" " IDA" "04:10:00"
"83224" "83223" "2017-02-20" "59" "1" "1" "SINALCO" "VUELTA" "04:20:00"


En este caso yo quiero logra que mi SELECT traiga estos dos registros que son parejas en 1 sola línea
"83223" "0" "2017-02-20" "59" "1" "100" "MEDIO REDONDO" " IDA" "04:10:00" "1" "SINALCO" "VUELTA" "04:20:00"

No se si con GROUP BY se puede; pero no se me ocurre nada. Solo tengo la vinculación en los campos id --> no_sal_vuelta. Donde la IDA es modo = 1 y la vuelta modo = 2 y como ven en la IDA no_sal_vuelta = 0, pero en la vuelta no_sal_vuelta = id de la IDA en este caso 83223.

Si alguien me puede ilustrar.
  #3 (permalink)  
Antiguo 21/02/2017, 12:11
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 12 años, 10 meses
Puntos: 447
Respuesta: Consulta en MySQL

Hola dgrvedado:

Hay varias formas de resolver este problema, una de ellas sería utilizando subconsultas para "simular" que la información viene en dos tablas: una sólo de "idas" y otra de "vueltas" y entonces hacer un JOIN, sería más o menos así:

Supongamos los datos que pones de ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +-------+---------------+--------------+--------+------------+----------+---------------+--------+-------------+
  3. | id    | no_sal_vuelta | fecha_salida | no_bus | no_redondo | id_ramal | ramal         | modo   | hora_salida |
  4. +-------+---------------+--------------+--------+------------+----------+---------------+--------+-------------+
  5. | 83223 |             0 | 2017-02-20   |     59 |          1 |      100 | MEDIO REDONDO | IDA    | 04:10:00    |
  6. | 83224 |         83223 | 2017-02-20   |     59 |          1 |        1 | SINALCO       | VUELTA | 04:20:00    |
  7. +-------+---------------+--------------+--------+------------+----------+---------------+--------+-------------+
  8. 2 rows in set (0.00 sec)

entonces, para las "idas" tendrías que hacer un SELECT a la tabla para los registros que tengan T1.no_sal_vuelta = 0, y para las "vueltas" tendrías que hacer un select para los que tengan T1.no_sal_vuelta != 0, de tal suelte que quedaría más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   *
  3.     -> FROM tabla T1
  4.     -> LEFT JOIN
  5.     -> ( SELECT
  6.     ->     *
  7.     ->   FROM tabla
  8.     ->   WHERE no_sal_vuelta != 0
  9.     -> ) T2 ON T1.id = T2.no_sal_v
  10.     -> WHERE T1.no_sal_vuelta = 0;
  11. +-------+---------------+--------------+--------+------------+----------+---------------+------+-------------+-------+---------------+--------------+--------+------------+----------+---------+--------+-------------+
  12. | id    | no_sal_vuelta | fecha_salida | no_bus | no_redondo | id_ramal | ramal         | modo | hora_salida | id    | no_sal_vuelta | fecha_salida | no_bus | no_redondo | id_ramal | ramal   | modo   | hora_salida |
  13. +-------+---------------+--------------+--------+------------+----------+---------------+------+-------------+-------+---------------+--------------+--------+------------+----------+---------+--------+-------------+
  14. | 83223 |             0 | 2017-02-20   |     59 |          1 |      100 | MEDIO REDONDO | IDA  | 04:10:00    | 83224 |         83223 | 2017-02-20   |     59 |          1 |        1 | SINALCO | VUELTA | 04:20:00    |
  15. +-------+---------------+--------------+--------+------------+----------+---------------+------+-------------+-------+---------------+--------------+--------+------------+----------+---------+--------+-------------+
  16. 1 row in set (0.00 sec)

lo que te queda hacer es simplemente cambiar los SELECT't * para obtener sólo los campos que requieres y en el orden en el que los necesitas.

Dale un vistazo y nos comentas.

Saludos
Leo

Etiquetas: fecha, php, registro, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:16.