Ayuda con consultas en una base de datos usando MySQL

Buenas chicos/as necesito vuestra ayuda resulta que me estoy liando con MySQL a la hora de resolver unas consultas en base a un diagrama relacional el cual me he tomado la molestia de convertir para facilitarme el asunto (pero ni aun si).
Diagrama convertido a modelo relacional:
TIENDAS (TID, TDIR, TLOC)
ALMACENES (AID, ADIR, ALOC)
PRODUCTOS (PID, DESCRIPCION, PESO, PRECIO)
AEXISTENCIAS (AID, PID, ACANT)
TEXISTENCIAS (TID, PID, TCANT)
PEDIDOS (PEDID, AID, TID, PID, CANT, FPED, FENT, ESTADO)

Donde se han marcado las claves primarias mediante subrayado de las mismas y las ajenas con negrita.

En dicha base de datos tengo que realizar las siguientes consultas

1) Obtener la descripción de los productos que tengan pedidos de más de 5 unidades por pedido, y que al menos se hayan pedido más de 100 unidades por tienda con esos pedidos.

2) Incrementar un 5 por ciento el precio de los productos que pesen más de 10 kilos y haya existencias en algún almacén.

3) Bajar un 7 por ciento el precio de los productos existentes en tiendas de Barcelona.

4) Obtener el número de tiendas de Madrid que tengan algún producto que no esté en ningún almacén de Madrid.

5) Obtener los códigos de las tiendas donde hay más de dos tipos distintos de productos

6) Obtener la localidad de la tienda que tiene el pedido de mayor importe.

7) Obtener la localidad de la tienda que más euros tiene en pedidos.

La cuestión es que hace tiempo 2 años que deje MySQL (ademas recuerdo que esa asignatura en la Uni la dábamos mediante entorno gráfico y no mediante comandos)

Ahora me he cruzado con una base de datos vieja (mediante Terminal) y se supone que mediante un Diagrama tengo que sacar dichos datos. Estrujándome los sesos he pasado a mano (sobre papel) dicho diagrama a un modelo relacional para facilitarme la compresión (lo tenis arriba).

Se supone que tengo que sacar dichos datos pero aun con "mi modelo relacional" (que creo que esta bien) hay cosas que no se como hacerlas (cruzar datos entre tablas)

Si me podéis echar una mano os lo agradecería.

Saludos
¿Las llaves ajenas PIO en otras tablas son la llave primaria (PID) de la tabla productos?
porque sino, no veo como se relacionan los productos con ninguna tabla.
Puedes instalarte mysql workbench en un pc y conectarte a esa mysql?
Para cruzar datos entre tablas, mírate el INNER JOIN, LEFT JOIN, RIGHT JOIN
(también tienes el CROSS JOIN o producto cartersiano)

Por ejemplo, si quieres cruzar los registros que existan en 2 tablas

SELECT *
FROM tabla1 INNER JOIN tabla2 ON tabla1.pk=tabla2.fk
(te devuelve toda la info de los registros cruzando las 2 tablas, pero además, si algún dato no está en una de las 2 tablas, no te da ningún dato para ese registro)

SELECT *
FROM tabla1 LEFT JOIN tabla2 ON tabla1.pk=tabla2.fk
(te devuelve toda la info de los registros cruzando las 2 tablas, pero además, si algún dato está en tabla1 y no en tabla2, te da los datos del registro en tabla1

SELECT *
FROM tabla1 RIGHT JOIN tabla2 ON tabla1.pk=tabla2.fk
(te devuelve toda la info de los registros cruzando las 2 tablas, pero además, si algún dato está en tabla2 y no en tabla1, te da los datos del registro en tabla2


Además de eso, lo que ha apuntado el compañero @waterdark : no parece que puedas cruzar ninguna tabla con productos (por eso no te he puesto el ejemplo con tus tablas), con lo que se queda muy cojo dicho esquema
@WaterDark y @jorcoval
Perdón ida de pinza mía PIO = PID (ya esta corregido) Es lo que tienen escribir cosas a las 3 de la madrugada

Vamos a ver he logrado ( eso creo) sacar algunos

1) Obtener la descripción de los productos que tengan pedidos de más de 5 unidades por pedido, y que al menos se hayan pedido más de 100 unidades por tienda con esos pedidos.

SELECT DISTINCT(DESCRIPCION)
FROM PRODUCTOS
INNER JOIN PEDIDOS ON PRODUCTOS.PID = PEDIDOS.PID AND CANT > 5 AND SUM(*) > 100
GROUP BY PRODUCTOS.DESCRIPCION;


3) Bajar un 7 por ciento el precio de los productos existentes en tiendas de Barcelona.

UPDATE PRODUCTOS, TEXISTENCIAS, TIENDAS SET PRECIO = PRECIO*0.93
WHERE PRODUCTOS.PID = TEXISTENCIAS.PID
AND TEXISTENCIAS.TID = TIENDAS.TID
AND TIENDAS.TLOC = 'BARCELONA';


4) Obtener el número de tiendas de Madrid que tengan algún producto que no esté en ningún almacén de Madrid.

SELECT COUNT(DISTINCT(TID)) AS TOTAL
FROM TIENDAS
INNER JOIN TEXISTENCIAS ON TEXISTENCIAS.TID = TIENDAS.TID AND TCANT <> 0
INNER JOIN AEXISTENCIAS ON TEXISTENCIAS.PID = AEXISTENCIAS.PID AND ACANT = 0;


5) Obtener los códigos de las tiendas donde hay más de dos tipos distintos de productos

SELECT DISTINCT(TIENDAS.TID)
FROM TIENDAS
INNER JOIN TEXISTENCIAS ON TEXISTENCIAS.TID = TIENDAS.TID
WHERE COUNT(PID) > 2
GROUP BY .PID;
(mensaje borrado)
Perfect Ardamax escribió:1) Obtener la descripción de los productos que tengan pedidos de más de 5 unidades por pedido, y que al menos se hayan pedido más de 100 unidades por tienda con esos pedidos.

SELECT DISTINCT(DESCRIPCION)
FROM PRODUCTOS
INNER JOIN PEDIDOS ON PRODUCTOS.PID = PEDIDOS.PID AND CANT > 5 AND SUM(*) > 100
GROUP BY PRODUCTOS.DESCRIPCION;


Usar DISTINCT y GROUP BY a la vez es redundante, ambos van a conseguir el mismo objetivo, así que usa solo uno.

Yo creo que deberías agrupar por la PK de producto, así sabes a que producto pertenece cada descripción y obtienes las descripciones de todos los productos que cumplan las condiciones, aunque tengas productos con descripciones idénticas.

En la clausula ON no creo que sea correcto incluir CANT > 5 AND SUM(*) > 100, quizás me equivoque...

SUM(*) querrás decir SUM(CANT), no?

CANT > 5 AND SUM(*) > 100 puede que esté mal, tendrías que aclarar si la suma de más de 100 unidades vendidas solo debe tener en cuenta los pedidos con más de 5 unidades, que es lo que estas haciendo ahora, o la suma de más de 100 unidades vendidas tiene en cuenta todos los pedidos de productos que al menos tenga un pedido con más de 100 unidades.

Yo lo haría así:
Para obtener la lista de productos que tengan al menos un pedido con más de 5 unidades:
SELECT DISTINCT T1.PID, T1.DESCRIPCION FROM PRODUCTOS
INNER JOIN PEDIDOS AS T2 ON T1.PID=T2.PID
WHERE T2.CANT > 5

La consulta final quedaría:
SELECT T2.PID, T2.DESCRIPCION FROM PEDIDOS AS T1
INNER JOIN
    (SELECT DISTINCT T1.PID, T1.DESCRIPCION FROM PRODUCTOS
        INNER JOIN PEDIDOS AS T2 ON T1.PID=T2.PID
        WHERE T2.CANT > 5) AS T2
ON T1.PID=T2.PID
GROUP BY T2.PID
HAVING SUM(T1.CANT) > 100
6 respuestas