MySQL - ¿Nos ayudáis a hacer una SQL? Por favor

 
Vista:
sin imagen de perfil

¿Nos ayudáis a hacer una SQL? Por favor

Publicado por Sergio (2 intervenciones) el 20/08/2022 00:11:09
Hola. Nosotros sabemos hacer algunas sentencias más o menos sencillas, pero hay una que no somos capaces de hacer y no sabemos si alguno de vosotros podría ayudarnos con ella. Indicamos: Tenemos 4 tablas implicadas, con nombre 'factura', 'factura_pedido', 'contacto' y 'cliente_contacto'

Los campos implicados para esta consulta de cada una de las tablas son:

factura - idfactura
- idperiodo_factura
- idcliente

factura_pedido - id_factura
- id_periodo

contacto - idcontacto
- nombre
- movil
- email

cliente_contacto - idcliente
- idcontacto

La cuestión es que necesitamos sacar el nombre, móvil y email de la tabla contacto de los clientes que tengan facturas emitidas (tabla factura) y que estas facturas estén también en la tabla factura_pedido. Las facturas se identifican siempre con dos parámetros, que son id_factura y id_periodo (por que hay facturas con mismo número pero de distintos años. Es decir, hay factura id_factura = 110 de distintos periodos, por ejemplo id_periodo = 21, id_periodo = 22 ....)

Nos perdemos por que obviamente la facturas y las facturas:_pedido se relacionan sin problema con los campos id_factura e id_pedido, y la factura identifica a los clientes con el campo idcliente, pero luego para conectarlo con el contacto (que es el que tiene nombre, móvil y email) , está en medio la tabla cliente_contacto que es la que conecta el idcliente con el idcontacto.....

Bueno, que para nosotros un verdadero lío, pero seguro que para alguno de vosotros es muy simple .... ¿Podéis ayudarnos un poco?

Gracias de antemano. Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Ivan

¿Nos ayudáis a hacer una SQL? Por favor

Publicado por Ivan (37 intervenciones) el 20/08/2022 12:13:57
Hola,

Si esta es la estructura de tu DB, no acabo de verle sentido añadir la tabla factura_pedido que parece que tiene las mismas claves que factura, que es donde está la idcliente. Pero bueno, por si acaso hay datos que son necesarios haré la consulta coincidiendo las 4 tablas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
factura
- idfactura
- idperiodo_factura
- idcliente
 
factura_pedido
- id_factura
- id_periodo
 
contacto
- idcontacto
- nombre
- movil
- email
 
cliente_contacto
- idcliente
- idcontacto

La forma de sacar los datos del cliente correspondiente a los parámetros (PHP) $factura_ID y $periodo_ID sería así:

1
2
3
4
5
6
7
SELECT F.*,  C.* FROM factura_pedido FP,  factura F, cliente_contacto CC, contacto C
WHERE FP.id_factura='$factura_ID'
AND FP.id_periodo='$periodo_ID'
AND F.idfactura=FP.id_factura
AND F.idperiodo_factura=FP.id_periodo
AND F.idcliente=CC.idcliente
AND CC.idcontacto=C.idcontacto

Esto mostrará los datos de las tablas factura y contacto que coincidan con $factura_ID y $periodo_ID.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

¿Nos ayudáis a hacer una SQL? Por favor

Publicado por Sergio (2 intervenciones) el 20/08/2022 16:19:08
Hola: Muchas gracias por la ayuda. A ver, tengo que comentar: Claro, efectivamente cada una de las tablas tiene muchos más datos. He puesto sólo los que están implicados en este tema, para no liarlo mucho. Se trata de un programa especial que nos hicieron hace muchísimo tiempo y donde se junta clientes que vienen desde distintas fuentes (una de ellas de otra base de datos distinta, de ahí las relaciones tan raras). He probado la consulta, y nos da un resultado vacio. Voy a intentar explicarlo de otra manera:

Los datos que necesitamos mostrar, que es lo fácil de entender, están en la tabla contacto, campos 'nombre', 'movil' y 'email'. Hasta ahí,, fácil. La cuestión es que necesitamos que salgan esos pero sólo los que tienen facturas en la tabla factura y ESA MISMA FACTURA se encuentra en la tabla factura_pedido. Esto podría ser relativamente sencillo si en la tabla factura hubiera habido un campo que hubiera relacionado directamente la factura con el contacto (un campo factura.idcontacto, para que nos entendamos), pero no, en la tabla factura está el campo que la relaciona con el cliente (factura.idcliente) y los datos están en la tabla contacto, con lo que entra en juego la otra tabla cliente_contacto que relaciona ambas.

Como sé que es complicado de entender y que yo me explico realmente mal, voy a poner lo que nosotros sí que conseguimos tras muchas vueltas:

- Hemos conseguido filtrar las facturas que están en tabla factura y que también están en factura_pedido, con la siguiente sentencia:

SELECT f.idfactura, f.idperiodo_factura from factura f
INNER JOIN factura_pedido fp
WHERE (fp.id_factura = f.idfactura) AND (fp.id_periodo=f.idperiodo_factura) AND (f.fecha>='2020-01-01')

Eso nos da el listado de idfactura (el identificador de las facturas en la tabla factura) que están también en la tabla 'factura_pedido'. Pero necesitamos ahora conseguir los nombres y los datos movil y email de los clientes que corresponden con esas facturas. Esos datos están en la tabla contacto y se relaciona con la tabla cliente a través de la tabla cliente_contacto.

Adjunto un croquis, por que con todo, sigo viendo que me explico fatal. Y de nuevo, gracias por el interés
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ivan

¿Nos ayudáis a hacer una SQL? Por favor

Publicado por Ivan (37 intervenciones) el 20/08/2022 18:10:32
Hola,

en la primera pregunta entendía que buscabais las facturas en la DB a través de variables externas ($factura_ID y $periodo_ID) y ahora veo que filtrais por fecha, pero bueno, el resultado será el mismo que vuestra query con la siguiente consulta:

1
2
3
4
5
6
SELECT F.*,  C.* FROM factura F, factura_pedido FP, cliente_contacto CC, contacto C
WHERE F.fecha>='2020-01-01')
AND F.idfactura=FP.id_factura
AND F.idperiodo_factura=FP.id_periodo
AND F.idcliente=CC.idcliente
AND CC.idcontacto=C.idcontacto

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar