entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problema con consulta SQL

Hola.

Tengo una tabla con mas o menos esta estructura

id_tarifario, id_producto
1               1
1               2   
1               3   
2               1   
2               2   
2               4   
2               5

Como puedo hacer para que una consulta me retorne los productos de 2 tarifarios pero teniendo prioridad uno sobre el otro digamos si el tarifario 1 tiene prioridad sobre el 2 que me retorne:

1               1
1               2
1               3
2               4
2               5

pero si el tarifario 2 tiene prioridad sobre el 1 que retorne:

2               1
2               2
1               3
2               4
2               5

Gracias por su ayuda.

2 Respuestas

1voto

jonatancastro1 Puntos3130

Bueno una solución temporal que encontré fue hacerlo asi:

(SELECT t1.* FROM tarifarios_productos t1 WHERE t1.id_tarifario = $prioridad1)  
UNION ALL 
(SELECT t2.* FROM tarifarios_productos t2 WHERE t2.id_tarifario = $prioridad2 AND t2.id_producto NOT IN (SELECT id_producto FROM tarifarios_productos WHERE id_tarifario = $prioridad1))

Por si se les presenta alguna vez el mismo caso. Saludos

2votos

Leonardo-Tadei Puntos227320

Hola @jonatancastro1,

Una alternativa más simple es ordenar y agrupar por tarifario.

Para esta tabla:

CREATE TABLE IF NOT EXISTS `prueba` (
  `id_tarifario` int(11) NOT NULL,
  `id_producto` int(11) NOT NULL,
  PRIMARY KEY (`id_tarifario`,`id_producto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `prueba` (`id_tarifario`, `id_producto`) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 1),
(2, 2),
(2, 4),
(2, 5);

Devuelve con prioridad el tarifario 1:

SELECT * FROM `prueba` 
GROUP BY id_producto
ORDER BY id_producto,  id_tarifario

Devuelve con prioridad el tarifario 2:

SELECT * FROM `prueba` 
GROUP BY id_producto
ORDER BY id_producto,  id_tarifario DESC

Después es más fácil ampliarlo a más tarifarios, siempre comparando de a dos, limiatndo con un WHERE qué tarifarios entran en la consulta.

Saludos!!

0voto

jonatancastro1 comentado

Hola, gracias por tu respuesta, había pensado algo así. Pero digamos que en este caso siempre vienen dos variables con id de tarifarios que pueden variar porque existen muchos y cada uno define o no características sobre los mismos productos, por esto necesitaba realizar una unión teniendo en cuenta cual tarifario primaba sobre el otro para obtener los detalles de los productos (no se si me hago entender jejeje). Igualmente gracias por la sugerencia @Leonardo-Tadei.

Saludos

0voto

Leonardo-Tadei comentado

Si la comparación de tarifarios siempre es de a dos, podés filtrar solo esos tarifarios agregando un WHERE a la consulta que te propongo. independientemente de la cantidad de tarifarios que haya.

Si la comparación es con más de 2 tarifarios, no veo como tu consulta lo puede solucionar, salvo que vayas agregando más UNION por cada tarifario a agregar, lo que te va a dar serior problemas de rendimiento.

Saludos cordiales!

0voto

jonatancastro1 comentado

Hola @Leonardo-Tadei. Tal vez yo me estoy complicando un poco jejeje y obviamente me gustaría implementar tu solución mas optima. pero cuando pruebo no me retorna los datos esperados aquí esta la tabla tal cual la tengo en este momento y las consultas:

CREATE TABLE `tarifarios_productos` (
  `id_tarifario` BIGINT(20) UNSIGNED NOT NULL,
  `id_producto` BIGINT(20) UNSIGNED NOT NULL,
  `precio_venta` INT(10) UNSIGNED NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT  INTO `tarifarios_productos`(`id_tarifario`,`id_producto`,`precio_venta`) VALUES (1,1,6500),(1,2,13000),(1,3,16300),(2,2,13000),(2,3,15200);

y la consulta que ejecute fue:

SELECT * FROM `tarifarios_productos` GROUP BY id_producto ORDER BY id_producto,  id_tarifario DESC

y me retorno esto

id_tarifario  id_producto  precio_venta  
------------  -----------  --------------
           1            1            6500
           1            2           13000
           1            3           16300

y con la consulta que hice en mi respuesta

(SELECT t1.* FROM tarifarios_productos t1 WHERE t1.id_tarifario = 2) UNION ALL (SELECT t2.* FROM tarifarios_productos t2 WHERE t2.id_tarifario = 1 AND t2.id_producto NOT IN (SELECT id_producto FROM tarifarios_productos WHERE id_tarifario = 2))

me retorno esto que es lo que espero:

id_tarifario  id_producto  precio_venta  
------------  -----------  --------------
           2            2           13000
           2            3           15200
           1            1            6500

Gracias por tu ayuda. Saludos

0voto

Leonardo-Tadei comentado

Hola Jonatan,

rehice las querys que te envié en esta pregunta, y tal cual como vos decís, el resultado no es correcto.
Francamente no sé que es lo que vi cuando lo probé por primera vez, ya que copié y pegué los resultados que te envié y me daban el resultado correcto.
Por otra parte, el resultado incorercto de mi query es obvio, porque la operación GROUP BY se resuelve antes que el ORDER BY, con lo que la estrategia de filtrado que quería usar no es correcta.
Si vuelvo a tener la inspiración de ese momento, te enviaré la query nuevamente.
Perdón por el equívico en esta respuesta.

Saludos cordiales!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta