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

Consulta anidada en SQL

Estas en el tema de Consulta anidada en SQL en el foro de Mysql en Foros del Web. Hola buenas tardes, necesito saber cual seria la mejor forma de hacer lo siguiente, creo que seria mediante sql, si no es así perdonad el ...
  #1 (permalink)  
Antiguo 19/02/2015, 09:50
 
Fecha de Ingreso: noviembre-2012
Mensajes: 73
Antigüedad: 11 años, 4 meses
Puntos: 1
Consulta anidada en SQL

Hola buenas tardes, necesito saber cual seria la mejor forma de hacer lo siguiente, creo que seria mediante sql, si no es así perdonad el intrusismo.
Tengo una tabla de articulos
Código SQL:
Ver original
  1. SELECT
  2.    codarticulo,
  3.    desarticulo,
  4.    importe,
  5.    codfamilia,
  6.    comentar
  7. FROM
  8.    articulo

Hasta aquí una consulta en la que muestro los articulos con sus precios, descripción...
Pero ahora quisiera que si es un cliente igual consulta la tabla articulos y a su vez consulta la tabla tarifas para poner el precio especial de dicho cliente.
Tabla tarifas

Código MySQL:
Ver original
  1.     codcliente,
  2.     codfamilia,
  3.     codarticulo,
  4.     importe
  5.    tarifas


El resultado seria si no es cliente, muestro los datos de la tabla articulos.
Articulo | Descripcion | Importe | Familia | Comentarios
001, cuadro,100,002, sin comentarios
002, cuadro,200,002, sin comentarios
003, cuadro,300,002, sin comentarios
004, cuadro,400,002, sin comentarios

Si es cliente, muestro los datos de la tabla articulos y si alguno coincide con la tabla tarifas muestro el precio de la tabla tarifas

Articulo | Descripcion | Importe | Familia | Comentarios
001, cuadro,100,002, sin comentarios
002, cuadro,200,002, sin comentarios
003, cuadro,150,002, sin comentarios (este articulo estaría en la tabla tarifas)
004, cuadro,400,002, sin comentarios

El caso es que si encuentra en la tabla tarifas que tambien está el articulo igual que en la tabla "articulos" debe pintar el precio de tarifas.
¿cual es la mejor forma de hacerlo?

Muchas gracias.

Última edición por gnzsoloyo; 19/02/2015 a las 11:04 Razón: Mal etiquetado
  #2 (permalink)  
Antiguo 19/02/2015, 11:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Consulta anidada en SQL

Hola quieropaginaweb:

Lo que quieres hacer es bastante simple en realidad... En primer lugar tienes que hacer uso de LEFT o RIGTH JOIN, si tienes dudas de cómo funcionan estos, puedes preguntarle a Santa Wikipedia:

http://es.wikipedia.org/wiki/Join

Esto te permitirá determinar aquellos artículos que tienen una tarifa especial para cierto cliente... el resto sería simplemente hacer un SELECT condicional, es decir algo como esto:

Código:
...
Si existe tarifa especial ENTONCES muestra tarifa especial SINO muestra tarifa regular
...
Para hacer esto, puedes hacerlo de dos formas, con la función IF o con la sentencia CASE-WHEN

Haz la prueba y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 19/02/2015, 17:12
 
Fecha de Ingreso: noviembre-2012
Mensajes: 73
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Consulta anidada en SQL

Gracias lo entiendo a medias, he hecho la consulta:
Código MySQL:
Ver original
  1.    articulo.codarticulo,
  2.    articulo.desarticulo,
  3.    articulo.importe,
  4.    articulo.codfamilia,
  5.    tarifas.cliente,
  6.    tarifas.codfamilia,
  7.    tarifas.codarticulo,
  8.    tarifas.cliente
  9.    articulo LEFT OUTER JOIN tarifas ON articulo.codart = tarifas.codart OR articulo.codfam = tarifas.codfam
[/PHP]

Resultado

codarticulo desarticulo importe familia cliente familia codart importecliente
001 PAPEL A 200.000 00001 11 00001
002 PAPEL B 200.000 00001 5 00001
003 PAPEL C 200.000 00001 4 00001
004 PAPEL D 103.400 00000 3 004 80



Ahora lo que tendría que hacer es:
listar todo:
odarticulo desarticulo importe familia cliente familia
001 PAPEL A 200.000 00001 11 00001
002 PAPEL B 200.000 00001 5 00001
003 PAPEL C 200.000 00001 4 00001
004 PAPEL D 80 00000 3
(este precio seria el del cliente, el resto al no estar asociado a ningun cliente se muestran directamente de la tabla articulos)

Entonces ahora haría los if?
Gracias por tu interés

Última edición por gnzsoloyo; 19/02/2015 a las 17:16 Razón: Por favor, usar el HIGHLIGHT "MYSQL"
  #4 (permalink)  
Antiguo 22/02/2015, 13:01
 
Fecha de Ingreso: noviembre-2012
Mensajes: 73
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Consulta anidada en SQL

He avanzado algo más

Código MySQL:
Ver original
  1.    articulo.codarticulo,
  2.    articulo.desarticulo,
  3.    articulo.importe,
  4.    articulo.codfamilia,
  5.    tarifas.cliente,
  6.    tarifas.codfamilia,
  7.    tarifas.codarticulo,
  8.    tarifas.importe,
  9.    tarifas.des,
  10.    tarifas.cliente
  11.        
  12.            IF (tarifas.cliente = 123 , tarifas.importe,articulo.importe) as tarifacliente
  13.          
  14.    articulo LEFT JOIN tarifas ON articulo.codarticulo = tarifas.codarticulo

Cita:
Editado: Por favor, usar los HIGHLOGH CORRECTOS. SQL no es PHP. Tiene su propio marcado.
Ahora me pinta el precio del cliente en la tabla tarifas y si no está el articulo me pinta el precio de la tabla articulo.
Pero cómo podría hacer para que si el campo tarifas.codarticulo está vacio (is NULL) lea el campo tarifas.codfamilia y aplique el descuento del campo tarifas. des?.
Gracias por tu ayuda, me es muy valiosa.

Última edición por gnzsoloyo; 22/02/2015 a las 13:06

Etiquetas: anidadas, sql
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 09:24.