5

En primer lugar, me disculpo por la longitud. Esto es un poco complicado (al menos para mí).Problema de estructura/manipulación de datos MySQL complicado

Antecedentes de la base de datos:

Tengo un productos, tabla de variables, y los precios. Los "productos" son la información principal con respecto a un producto (descripción, título, etc.). Los "precios" tienen información sobre cada precio (precio, costo, cantidad mínima requerida, costo de envío, etc.), ya que algunos productos pueden tener más de un precio (un widget de 10 "es un precio diferente que un widget de 12", por ejemplo) . Las "variables" son variaciones del producto que no cambian el precio, como el color, el tamaño, etc.

Inicialmente (cuando construí esta base de datos hace aproximadamente 7 años) tenía la información variable almacenada en el primer precio en una lista de precios para el mismo producto en un formato delimitado por tuberías (sí, lo sé, badbadbad). Esto funcionó en general, pero siempre hemos tenido un problema, donde algunas veces una variable no sería consistente entre todos los precios.

Por ejemplo, un Widget (producto) puede ser de 10 "o 12" y venderse por $ 10 y $ 20 (precios) respectivamente. Sin embargo, aunque el widget de 10 "puede estar disponible en azul y rojo (variables), el widget de 12" solo está disponible en rojo. Mejoramos este problema agregando una pequeña afirmación entre paréntesis en la variable incongruente como "Rojo (SOLAMENTE 10"). Este tipo de trabajo funciona, pero los clientes no siempre son tan inteligentes y dedican mucho tiempo a corregir errores cuando un cliente selecciona un widget de 12 "en rojo.

Desde entonces he recibido la tarea de modernizar la base de datos y he decidido poner las variables en su propia tabla y hacerlas más dinámicas y más fáciles de combinar con ciertos precios, así como mantener un inventario a prueba de errores (puede Imagina las pesadillas).

Mi primer paso fue escribir un procedimiento almacenado en mi prueba db (para cuando realice la conversión) para procesar todas las variables existentes en una nueva tabla variable (y tabla de etiquetas, pero eso no es realmente importante, no lo hago t pensar). Analicé efectivamente las variables y las enumeré con la identificación del producto correcta y la identificación del producto con la que inicialmente estaban asociadas en la tabla de variables. Sin embargo, me di cuenta de que esto es solo una parte del problema, ya que yo (al menos para la transformación inicial de la base de datos) quiero que cada variable aparezca como conectada a cada precio para un producto determinado.

Para hacer esto, he creado otra mesa, así:

 
tblvariablesprices 
variablepriceid | variableid | priceid | productid 

que es una relación muchos-a-muchos con la tabla de variables.

Problemas:

Mi problema ahora es, no sé cómo crear las filas. Puedo crear una combinación de la izquierda en mis tablas de precios y variables para obtener (creo) todos los datos necesarios, simplemente no sé cómo pasarlo. My SQL es (MySQL 5.0):

SELECT p.priceid, p.productid, variableid, labelid 
FROM tblprices p 
LEFT JOIN tblvariables v ON p.priceid = v.priceid 
ORDER BY productid, priceid 

Esto me va a conseguir cada priceid y idproducto y cualesquiera identificadores de variables a juego y etiquetas. Esto es bueno en ciertos casos, como cuando tengo algo como:

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) --- another price for product 

porque ahora sé que tengo que crear un registro para priceid 2 y variableids 10, 11, 12, y luego también para priceid 3 para ese producto.Sin embargo, también tengo los resultados de esta base de datos para los productos con ninguna variable, productos con variables de un precio y múltiples, y los productos con múltiples precios y sin variables, por ejemplo:

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) 
4  | 8   | (null)  | (null) --- 1 price no variables 
5  | 9   | 13   | 5  --- mult vars, 1 price 
5  | 9   | 14   | 5 
5  | 9   | 15   | 6 
5  | 9   | 16   | 6 
6  | 10  | (null)  | (null) --- mult price, no vars 
7  | 10  | (null)  | (null) 
8  | 10  | (null)  | (null) 

Tomando el conjunto de datos anterior, quiero añadir entradas en mi mesa tblpricesvariables así:

 
variablepriceid | variableid | priceid | productid 
1    | 10   | 2  | 7 
2    | 11   | 2  | 7 
3    | 12   | 2  | 7 
4    | 10   | 3  | 7 
5    | 11   | 3  | 7 
6    | 12   | 3  | 7 
7    | 13   | 5  | 9 
8    | 14   | 5  | 9 
9    | 15   | 5  | 9 
10    | 16   | 5  | 9 

tengo miles de registros a proceso, por lo que, obviamente, hacer esto de forma manual no es la respuesta. ¿Alguien puede al menos señalarme en la dirección correcta, si no viene con un sproc que podría manejar este tipo de operación? También me gustaría recibir cualquier comentario sobre cómo organizar y/o estructurar mejor estos datos.

Muchas gracias por leer todo esto y ayudarme.

Respuesta

2

¿Qué tal:

SELECT DISTINCT b.variableid, a.priceid, a.productid 
FROM tblprices AS a 
JOIN tblprices AS b ON a.productid = b.productid 
WHERE b.labelid IS NOT NULL 
ORDER BY priceid; 

+------------+---------+-----------+ 
| variableid | priceid | productid | 
+------------+---------+-----------+ 
|   10 |  2 |   7 | 
|   11 |  2 |   7 | 
|   12 |  2 |   7 | 
|   10 |  3 |   7 | 
|   11 |  3 |   7 | 
|   12 |  3 |   7 | 
|   13 |  5 |   9 | 
|   14 |  5 |   9 | 
|   15 |  5 |   9 | 
|   16 |  5 |   9 | 
+------------+---------+-----------+ 

insertar en tblvariables se deja como ejercicio para el lector;)

+0

mierda santa. esto es EXACTAMENTE lo que necesitaba (con algunas adiciones menores, por supuesto). wow amigo Guau. – Jason

+0

Su bienvenida. La próxima vez, siga los consejos de Dean y agregue las sentencias CREATE e INSERT, ahorra tanto tiempo en la reproducción de la estructura de su base de datos. – chris

+0

ah, vale, ya veo lo que dices. Lo siento. gracias por tomar mi problema aparentemente grande (para mí) y hacer que parezca un juego de niños. jeez – Jason

1

creo que esto debería funcionar:

SELECT v.variableid, p.productid, p.priceid DE tblvariables v, p tblprices DONDE v.priceid EN (SELECCIONAR s.priceid DE tblprices s DONDE s.productid = p.productid);

La próxima vez, ¿puede agregar instrucciones de creación e inserción para replicar su configuración? Gracias.

+0

Sí, crea e inserta habría hecho ahorrado algún tiempo – chris

+0

muchas gracias ... esto es decano también es una solución adecuada (obtiene los datos correctos), pero la de Chris tarda alrededor de 7 segundos en ejecutarse y la suya tarda alrededor de 1-2 minutos. ¡gracias por la ayuda! – Jason